sqlalchemy-commits Mailing List for SQLAlchemy (Page 375)
Brought to you by:
zzzeek
You can subscribe to this list here.
2006 |
Jan
|
Feb
(74) |
Mar
(167) |
Apr
(127) |
May
(190) |
Jun
(119) |
Jul
(77) |
Aug
(82) |
Sep
(84) |
Oct
(153) |
Nov
(45) |
Dec
(54) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(109) |
Feb
(80) |
Mar
(110) |
Apr
(106) |
May
(92) |
Jun
(147) |
Jul
(288) |
Aug
(307) |
Sep
(108) |
Oct
(156) |
Nov
(147) |
Dec
(134) |
2008 |
Jan
(126) |
Feb
(91) |
Mar
(184) |
Apr
(208) |
May
(212) |
Jun
(54) |
Jul
(106) |
Aug
(80) |
Sep
(58) |
Oct
(80) |
Nov
(119) |
Dec
(220) |
2009 |
Jan
(202) |
Feb
(50) |
Mar
(70) |
Apr
(46) |
May
(80) |
Jun
(61) |
Jul
(146) |
Aug
(81) |
Sep
(71) |
Oct
(74) |
Nov
(66) |
Dec
(82) |
2010 |
Jan
(112) |
Feb
(169) |
Mar
(235) |
Apr
(77) |
May
(22) |
Jun
(31) |
Jul
(46) |
Aug
(46) |
Sep
(70) |
Oct
(36) |
Nov
(37) |
Dec
(79) |
2011 |
Jan
(46) |
Feb
(54) |
Mar
(65) |
Apr
(73) |
May
(31) |
Jun
(46) |
Jul
(40) |
Aug
(36) |
Sep
(44) |
Oct
(33) |
Nov
(19) |
Dec
(10) |
2012 |
Jan
(60) |
Feb
(37) |
Mar
(35) |
Apr
(28) |
May
(27) |
Jun
(50) |
Jul
(33) |
Aug
(88) |
Sep
(64) |
Oct
(74) |
Nov
(62) |
Dec
(41) |
2013 |
Jan
(30) |
Feb
(37) |
Mar
(39) |
Apr
(52) |
May
(40) |
Jun
(85) |
Jul
(74) |
Aug
(76) |
Sep
(26) |
Oct
(76) |
Nov
(63) |
Dec
(65) |
2014 |
Jan
(68) |
Feb
(82) |
Mar
(87) |
Apr
(24) |
May
(66) |
Jun
(34) |
Jul
(86) |
Aug
(75) |
Sep
(70) |
Oct
(41) |
Nov
(23) |
Dec
(53) |
2015 |
Jan
(40) |
Feb
(39) |
Mar
(69) |
Apr
(64) |
May
(40) |
Jun
(43) |
Jul
(20) |
Aug
(48) |
Sep
(38) |
Oct
(28) |
Nov
(34) |
Dec
(44) |
2016 |
Jan
(82) |
Feb
(49) |
Mar
(25) |
Apr
(21) |
May
(19) |
Jun
(46) |
Jul
(38) |
Aug
(21) |
Sep
(33) |
Oct
(44) |
Nov
(26) |
Dec
(10) |
2017 |
Jan
(52) |
Feb
(18) |
Mar
(61) |
Apr
(43) |
May
(57) |
Jun
(36) |
Jul
(37) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <co...@sq...> - 2006-03-02 02:12:00
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1082] sqlalchemy/trunk/CHANGES: formatting</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1082</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 20:11:51 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>formatting</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1081 => 1082)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-03-02 01:54:10 UTC (rev 1081) +++ sqlalchemy/trunk/CHANGES 2006-03-02 02:11:51 UTC (rev 1082) </span><span class="lines">@@ -32,6 +32,7 @@ </span><span class="cx"> be connected via the function "global_connect". </span><span class="cx"> - added "refresh(*obj)" method to objectstore / Session to reload the attributes of </span><span class="cx"> any set of objects from the database unconditionally </span><ins>+ </ins><span class="cx"> 0.1.2 </span><span class="cx"> - fixed a recursive call in schema that was somehow running 994 times then returning </span><span class="cx"> normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-02 01:54:19
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1081] sqlalchemy/tags/rel_0_1_3/: release tag for 0.1.3</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1081</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 19:54:10 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>release tag for 0.1.3</pre> <h3>Added Paths</h3> <ul> <li>sqlalchemy/tags/rel_0_1_3/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_3fromrev1080sqlalchemytrunk"></a> <div class="copfile"><h4>Copied: sqlalchemy/tags/rel_0_1_3 (from rev 1080, sqlalchemy/trunk) ( => )</h4> <pre class="diff"><span> <span class="info"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-02 01:49:08
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1080] sqlalchemy/trunk: its release time</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1080</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 19:48:58 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>its release time</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> <li><a href="#sqlalchemytrunksetuppy">sqlalchemy/trunk/setup.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1079 => 1080)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-03-02 01:45:31 UTC (rev 1079) +++ sqlalchemy/trunk/CHANGES 2006-03-02 01:48:58 UTC (rev 1080) </span><span class="lines">@@ -30,6 +30,8 @@ </span><span class="cx"> - tables can be created with no engine specified. this will default their engine </span><span class="cx"> to a module-scoped "default engine" which is a ProxyEngine. this engine can </span><span class="cx"> be connected via the function "global_connect". </span><ins>+- added "refresh(*obj)" method to objectstore / Session to reload the attributes of +any set of objects from the database unconditionally </ins><span class="cx"> 0.1.2 </span><span class="cx"> - fixed a recursive call in schema that was somehow running 994 times then returning </span><span class="cx"> normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </span></span></pre></div> <a id="sqlalchemytrunksetuppy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/setup.py (1079 => 1080)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/setup.py 2006-03-02 01:45:31 UTC (rev 1079) +++ sqlalchemy/trunk/setup.py 2006-03-02 01:48:58 UTC (rev 1080) </span><span class="lines">@@ -3,7 +3,7 @@ </span><span class="cx"> from setuptools import setup, find_packages </span><span class="cx"> </span><span class="cx"> setup(name = "SQLAlchemy", </span><del>- version = "0.1.2", </del><ins>+ version = "0.1.3", </ins><span class="cx"> description = "Database Abstraction Library", </span><span class="cx"> author = "Mike Bayer", </span><span class="cx"> author_email = "mi...@zz...", </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-02 01:45:44
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1079] sqlalchemy/trunk/lib/sqlalchemy: added objectstore.refresh(), including supporting changes in mapper, attributes, util</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1079</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 19:45:31 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added objectstore.refresh(), including supporting changes in mapper, attributes, util</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyattributespy">sqlalchemy/trunk/lib/sqlalchemy/attributes.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingobjectstorepy">sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyutilpy">sqlalchemy/trunk/lib/sqlalchemy/util.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyattributespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/attributes.py (1078 => 1079)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-02 00:44:18 UTC (rev 1078) +++ sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-02 01:45:31 UTC (rev 1079) </span><span class="lines">@@ -65,6 +65,8 @@ </span><span class="cx"> self.extension = extension </span><span class="cx"> def gethistory(self, *args, **kwargs): </span><span class="cx"> return self </span><ins>+ def clear(self): + del self.obj.__dict__[self.key] </ins><span class="cx"> def history_contains(self, obj): </span><span class="cx"> return self.orig is obj or self.obj.__dict__[self.key] is obj </span><span class="cx"> def setattr_clean(self, value): </span><span class="lines">@@ -314,7 +316,8 @@ </span><span class="cx"> pass </span><span class="cx"> </span><span class="cx"> def remove(self, obj): </span><del>- """not sure what this is.""" </del><ins>+ """called when an object is totally being removed from memory""" + # currently a no-op since the state of the object is attached to the object itself </ins><span class="cx"> pass </span><span class="cx"> </span><span class="cx"> def create_history(self, obj, key, uselist, callable_=None, **kwargs): </span><span class="lines">@@ -350,6 +353,8 @@ </span><span class="cx"> When the attribute is next accessed, a new container will be created via the </span><span class="cx"> class-level history container definition.""" </span><span class="cx"> try: </span><ins>+ x = self.attribute_history(obj)[key] + x.clear() </ins><span class="cx"> del self.attribute_history(obj)[key] </span><span class="cx"> except KeyError: </span><span class="cx"> pass </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1078 => 1079)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-02 00:44:18 UTC (rev 1078) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-02 01:45:31 UTC (rev 1079) </span><span class="lines">@@ -235,6 +235,7 @@ </span><span class="cx"> def instances(self, cursor, *mappers, **kwargs): </span><span class="cx"> limit = kwargs.get('limit', None) </span><span class="cx"> offset = kwargs.get('offset', None) </span><ins>+ populate_existing = kwargs.get('populate_existing', False) </ins><span class="cx"> </span><span class="cx"> result = util.HistoryArraySet() </span><span class="cx"> if len(mappers): </span><span class="lines">@@ -247,7 +248,7 @@ </span><span class="cx"> row = cursor.fetchone() </span><span class="cx"> if row is None: </span><span class="cx"> break </span><del>- self._instance(row, imap, result) </del><ins>+ self._instance(row, imap, result, populate_existing=populate_existing) </ins><span class="cx"> i = 0 </span><span class="cx"> for m in mappers: </span><span class="cx"> m._instance(row, imap, otherresults[i]) </span><span class="lines">@@ -270,21 +271,25 @@ </span><span class="cx"> #print "key: " + repr(key) + " ident: " + repr(ident) </span><span class="cx"> return self._get(key, ident) </span><span class="cx"> </span><del>- def _get(self, key, ident=None): </del><ins>+ def _get(self, key, ident=None, reload=False): + if not reload: + try: + return objectstore.get_session()._get(key) + except KeyError: + pass + + if ident is None: + ident = key[1] + i = 0 + params = {} + for primary_key in self.pks_by_table[self.table]: + params["pk_"+primary_key.key] = ident[i] + i += 1 </ins><span class="cx"> try: </span><del>- return objectstore.get_session()._get(key) - except KeyError: - if ident is None: - ident = key[2] - i = 0 - params = {} - for primary_key in self.pks_by_table[self.table]: - params["pk_"+primary_key.key] = ident[i] - i += 1 - try: - return self.select(self._get_clause, params=params)[0] - except IndexError: - return None </del><ins>+ statement = self._compile(self._get_clause) + return self._select_statement(statement, params=params, populate_existing=reload)[0] + except IndexError: + return None </ins><span class="cx"> </span><span class="cx"> </span><span class="cx"> def identity_key(self, *primary_key): </span><span class="lines">@@ -449,10 +454,7 @@ </span><span class="cx"> </span><span class="cx"> def select_whereclause(self, whereclause=None, params=None, **kwargs): </span><span class="cx"> statement = self._compile(whereclause, **kwargs) </span><del>- if params is not None: - return self.select_statement(statement, **params) - else: - return self.select_statement(statement) </del><ins>+ return self._select_statement(statement, params=params) </ins><span class="cx"> </span><span class="cx"> def count(self, whereclause=None, params=None, **kwargs): </span><span class="cx"> s = self.table.count(whereclause) </span><span class="lines">@@ -462,13 +464,18 @@ </span><span class="cx"> return s.scalar() </span><span class="cx"> </span><span class="cx"> def select_statement(self, statement, **params): </span><del>- statement.use_labels = True - return self.instances(statement.execute(**params)) </del><ins>+ return self._select_statement(statement, params=params) </ins><span class="cx"> </span><span class="cx"> def select_text(self, text, **params): </span><span class="cx"> t = sql.text(text, engine=self.primarytable.engine) </span><span class="cx"> return self.instances(t.execute(**params)) </span><span class="cx"> </span><ins>+ def _select_statement(self, statement, params=None, **kwargs): + statement.use_labels = True + if params is None: + params = {} + return self.instances(statement.execute(**params), **kwargs) + </ins><span class="cx"> def _getpropbycolumn(self, column): </span><span class="cx"> try: </span><span class="cx"> prop = self.columntoproperty[column.original] </span><span class="lines">@@ -722,11 +729,10 @@ </span><span class="cx"> </span><span class="cx"> isnew = False </span><span class="cx"> if populate_existing: </span><del>- isnew = not imap.has_key(identitykey) - if isnew: </del><ins>+ if not imap.has_key(identitykey): </ins><span class="cx"> imap[identitykey] = instance </span><span class="cx"> for prop in self.props.values(): </span><del>- prop.execute(instance, row, identitykey, imap, isnew) </del><ins>+ prop.execute(instance, row, identitykey, imap, True) </ins><span class="cx"> </span><span class="cx"> if self.extension.append_result(self, row, imap, result, instance, isnew, populate_existing=populate_existing): </span><span class="cx"> if result is not None: </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py (1078 => 1079)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-02 00:44:18 UTC (rev 1078) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-02 01:45:31 UTC (rev 1079) </span><span class="lines">@@ -144,6 +144,10 @@ </span><span class="cx"> if self.parent_uow is None: </span><span class="cx"> self.uow.commit() </span><span class="cx"> </span><ins>+ def refresh(self, *obj): + for o in obj: + self.uow.refresh(o) + </ins><span class="cx"> def register_clean(self, obj): </span><span class="cx"> self._bind_to(obj) </span><span class="cx"> self.uow.register_clean(obj) </span><span class="lines">@@ -221,6 +225,11 @@ </span><span class="cx"> current mapped object instances, as they are no longer in the Identity Map.""" </span><span class="cx"> get_session().clear() </span><span class="cx"> </span><ins>+def refresh(*obj): + """reloads the state of this object from the database, and cancels any in-memory + changes.""" + get_session().refresh(*obj) + </ins><span class="cx"> def delete(*obj): </span><span class="cx"> """registers the given objects as to be deleted upon the next commit""" </span><span class="cx"> s = get_session().delete(*obj) </span><span class="lines">@@ -308,6 +317,10 @@ </span><span class="cx"> def _put(self, key, obj): </span><span class="cx"> self.identity_map[key] = obj </span><span class="cx"> </span><ins>+ def refresh(self, obj): + self.rollback_object(obj) + object_mapper(obj)._get(obj._instance_key, reload=True) + </ins><span class="cx"> def has_key(self, key): </span><span class="cx"> """returns True if the given key is present in this UnitOfWork's identity map.""" </span><span class="cx"> return self.identity_map.has_key(key) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyutilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/util.py (1078 => 1079)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-03-02 00:44:18 UTC (rev 1078) +++ sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-03-02 01:45:31 UTC (rev 1079) </span><span class="lines">@@ -327,6 +327,10 @@ </span><span class="cx"> self.records = {} </span><span class="cx"> for l in list: </span><span class="cx"> self.append_nohistory(l) </span><ins>+ def clear(self): + """clears the list and removes all history.""" + self.data[:] = [] + self.records = {} </ins><span class="cx"> def added_items(self): </span><span class="cx"> """returns a list of items that have been added since the last "committed" state.""" </span><span class="cx"> return [key for key in self.data if self.records[key] is True] </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-02 00:44:26
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1078] sqlalchemy/trunk/doc/build/content/types.myt: unicode</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1078</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 18:44:18 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>unicode</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcontenttypesmyt">sqlalchemy/trunk/doc/build/content/types.myt</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocbuildcontenttypesmyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/types.myt (1077 => 1078)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/types.myt 2006-03-02 00:42:26 UTC (rev 1077) +++ sqlalchemy/trunk/doc/build/content/types.myt 2006-03-02 00:44:18 UTC (rev 1078) </span><span class="lines">@@ -10,24 +10,29 @@ </span><span class="cx"> </p> </span><span class="cx"> <p>The standard set of generic types are:</p> </span><span class="cx"> <&|formatting.myt:code&> </span><del>-# sqlalchemy.types package: -class String(TypeEngine): - def __init__(self, length=None) - -class Integer(TypeEngine) - -class Numeric(TypeEngine): - def __init__(self, precision=10, length=2) - -class Float(TypeEngine): - def __init__(self, precision=10) - -class DateTime(TypeEngine) - -class Binary(TypeEngine): - def __init__(self, length=None) - -class Boolean(TypeEngine) </del><ins>+ # sqlalchemy.types package: + class String(TypeEngine): + def __init__(self, length=None) + + class Integer(TypeEngine) + + class Numeric(TypeEngine): + def __init__(self, precision=10, length=2) + + class Float(TypeEngine): + def __init__(self, precision=10) + + class DateTime(TypeEngine) + + class Binary(TypeEngine): + def __init__(self, length=None) + + class Boolean(TypeEngine) + + # converts unicode strings to raw bytes + # as bind params, raw bytes to unicode as + # rowset values + class Unicode(String) </ins><span class="cx"> </&> </span><span class="cx"> <p>More specific subclasses of these types are available, to allow finer grained control over types:</p> </span><span class="cx"> <&|formatting.myt:code&> </span><span class="lines">@@ -81,4 +86,4 @@ </span><span class="cx"> return self </span><span class="cx"> </&> </span><span class="cx"> </&> </span><del>-</&> </del><span class="cx">\ No newline at end of file </span><ins>+</&> </ins></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-02 00:42:35
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1077] sqlalchemy/trunk/doc/build/content/docstrings.myt: module fix</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1077</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 18:42:26 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>module fix</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcontentdocstringsmyt">sqlalchemy/trunk/doc/build/content/docstrings.myt</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocbuildcontentdocstringsmyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/docstrings.myt (1076 => 1077)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/docstrings.myt 2006-03-02 00:38:16 UTC (rev 1076) +++ sqlalchemy/trunk/doc/build/content/docstrings.myt 2006-03-02 00:42:26 UTC (rev 1077) </span><span class="lines">@@ -8,15 +8,17 @@ </span><span class="cx"> import sqlalchemy.pool as pool </span><span class="cx"> import sqlalchemy.mapping as mapping </span><span class="cx"> import sqlalchemy.exceptions as exceptions </span><ins>+ import sqlalchemy.ext.proxy as proxy </ins><span class="cx"> </%init> </span><span class="cx"> </span><span class="cx"> </span><span class="cx"> <& pydoc.myt:obj_doc, obj=schema &> </span><span class="cx"> <& pydoc.myt:obj_doc, obj=engine, classes=[engine.SQLEngine, engine.ResultProxy, engine.RowProxy] &> </span><del>-<& pydoc.myt:obj_doc, obj=sql, classes=[sql.Compiled, sql.ClauseElement, sql.TableImpl, sql.ColumnImpl] &> </del><ins>+<& pydoc.myt:obj_doc, obj=sql, classes=[sql.Compiled, sql.ClauseElement, sql.TableClause, sql.ColumnClause] &> </ins><span class="cx"> <& pydoc.myt:obj_doc, obj=pool, classes=[pool.DBProxy, pool.Pool, pool.QueuePool, pool.SingletonThreadPool] &> </span><span class="cx"> <& pydoc.myt:obj_doc, obj=mapping &> </span><span class="cx"> <& pydoc.myt:obj_doc, obj=mapping.objectstore, classes=[mapping.objectstore.Session, mapping.objectstore.Session.SessionTrans, mapping.objectstore.UnitOfWork] &> </span><span class="cx"> <& pydoc.myt:obj_doc, obj=exceptions &> </span><ins>+<& pydoc.myt:obj_doc, obj=proxy &> </ins><span class="cx"> </span><span class="cx"> </&> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-02 00:38:30
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1076] sqlalchemy/trunk: engine argument on tables optional</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1076</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 18:38:16 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>engine argument on tables optional test suite uses BaseProxyEngine as a base for the tester engine documented global proxy engine</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> <li><a href="#sqlalchemytrunkdocbuildcontentdbenginemyt">sqlalchemy/trunk/doc/build/content/dbengine.myt</a></li> <li><a href="#sqlalchemytrunklibsqlalchemy__init__py">sqlalchemy/trunk/lib/sqlalchemy/__init__.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyschemapy">sqlalchemy/trunk/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemytrunktesttestbasepy">sqlalchemy/trunk/test/testbase.py</a></li> <li><a href="#sqlalchemytrunktesttesttypespy">sqlalchemy/trunk/test/testtypes.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1075 => 1076)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-03-02 00:30:49 UTC (rev 1075) +++ sqlalchemy/trunk/CHANGES 2006-03-02 00:38:16 UTC (rev 1076) </span><span class="lines">@@ -27,6 +27,9 @@ </span><span class="cx"> result set side. </span><span class="cx"> - postgres maintains a list of ANSI functions that must have no parenthesis so </span><span class="cx"> function calls with no arguments work consistently </span><ins>+- tables can be created with no engine specified. this will default their engine +to a module-scoped "default engine" which is a ProxyEngine. this engine can +be connected via the function "global_connect". </ins><span class="cx"> 0.1.2 </span><span class="cx"> - fixed a recursive call in schema that was somehow running 994 times then returning </span><span class="cx"> normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </span></span></pre></div> <a id="sqlalchemytrunkdocbuildcontentdbenginemyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/dbengine.myt (1075 => 1076)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/dbengine.myt 2006-03-02 00:30:49 UTC (rev 1075) +++ sqlalchemy/trunk/doc/build/content/dbengine.myt 2006-03-02 00:38:16 UTC (rev 1076) </span><span class="lines">@@ -141,8 +141,28 @@ </span><span class="cx"> engine.connect(environ['db_uri']) </span><span class="cx"> # now you have a real db connection and can select, insert, etc. </span><span class="cx"> </&> </span><ins>+ + <&|doclib.myt:item, name="defaultproxy", description="Using the Global Proxy" &> + <p>There is an instance of ProxyEngine available within the schema package as "default_engine". You can construct Table objects and not specify the engine parameter, and they will connect to this engine by default. To connect the default_engine, use the <span class="codeline">global_connect</span> function.</p> + <&|formatting.myt:code&> + # define the tables and mappers + from sqlalchemy import * + + # specify a table with no explicit engine + users = Table('users', + Column('user_id', Integer, primary_key=True), + Column('user_name', String) + ) + + # connect the global proxy engine + global_connect('sqlite://filename=foo.db') </ins><span class="cx"> </span><ins>+ # create the table in the selected database + users.create() </ins><span class="cx"> </&> </span><ins>+ + </&> + </&> </ins><span class="cx"> <&|doclib.myt:item, name="transactions", description="Transactions" &> </span><span class="cx"> <p>A SQLEngine also provides an interface to the transactional capabilities of the underlying DBAPI connection object, as well as the connection object itself. Note that when using the object-relational-mapping package, described in a later section, basic transactional operation is handled for you automatically by its "Unit of Work" system; the methods described here will usually apply just to literal SQL update/delete/insert operations or those performed via the SQL construction library.</p> </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemy__init__py"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/__init__.py (1075 => 1076)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/__init__.py 2006-03-02 00:30:49 UTC (rev 1075) +++ sqlalchemy/trunk/lib/sqlalchemy/__init__.py 2006-03-02 00:38:16 UTC (rev 1076) </span><span class="lines">@@ -15,3 +15,7 @@ </span><span class="cx"> import sqlalchemy.schema </span><span class="cx"> import sqlalchemy.ext.proxy </span><span class="cx"> sqlalchemy.schema.default_engine = sqlalchemy.ext.proxy.ProxyEngine() </span><ins>+ +def global_connect(*args, **kwargs): + sqlalchemy.schema.default_engine.connect(*args, **kwargs) + </ins><span class="cx">\ No newline at end of file </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/schema.py (1075 => 1076)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-03-02 00:30:49 UTC (rev 1075) +++ sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-03-02 00:38:16 UTC (rev 1076) </span><span class="lines">@@ -47,6 +47,9 @@ </span><span class="cx"> """a metaclass used by the Table object to provide singleton behavior.""" </span><span class="cx"> def __call__(self, name, engine=None, *args, **kwargs): </span><span class="cx"> try: </span><ins>+ if not isinstance(engine, SchemaEngine): + args = [engine] + list(args) + engine = None </ins><span class="cx"> if engine is None: </span><span class="cx"> engine = default_engine </span><span class="cx"> name = str(name) # in case of incoming unicode </span></span></pre></div> <a id="sqlalchemytrunktesttestbasepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/testbase.py (1075 => 1076)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/testbase.py 2006-03-02 00:30:49 UTC (rev 1075) +++ sqlalchemy/trunk/test/testbase.py 2006-03-02 00:38:16 UTC (rev 1076) </span><span class="lines">@@ -1,7 +1,8 @@ </span><span class="cx"> import unittest </span><span class="cx"> import StringIO </span><span class="cx"> import sqlalchemy.engine as engine </span><del>-import sqlalchemy.ext.proxy </del><ins>+import sqlalchemy.ext.proxy as proxy +import sqlalchemy.schema as schema </ins><span class="cx"> import re, sys </span><span class="cx"> </span><span class="cx"> echo = True </span><span class="lines">@@ -47,7 +48,7 @@ </span><span class="cx"> raise "Could not create engine. specify --db <sqlite|sqlite_file|postgres|mysql|oracle> to test runner." </span><span class="cx"> </span><span class="cx"> if PROXY: </span><del>- db = sqlalchemy.ext.proxy.ProxyEngine(echo=echo, default_ordering=True) </del><ins>+ db = proxy.ProxyEngine(echo=echo, default_ordering=True) </ins><span class="cx"> db.connect(db_uri) </span><span class="cx"> else: </span><span class="cx"> db = engine.create_engine(db_uri, echo=echo, default_ordering=True) </span><span class="lines">@@ -103,17 +104,21 @@ </span><span class="cx"> finally: </span><span class="cx"> self.assert_(db.sql_count == count, "desired statement count %d does not match %d" % (count, db.sql_count)) </span><span class="cx"> </span><del>-class EngineAssert(object): </del><ins>+class EngineAssert(proxy.BaseProxyEngine): </ins><span class="cx"> """decorates a SQLEngine object to match the incoming queries against a set of assertions.""" </span><span class="cx"> def __init__(self, engine): </span><del>- self.engine = engine </del><ins>+ self._engine = engine </ins><span class="cx"> self.realexec = engine.post_exec </span><span class="cx"> self.realexec.im_self.post_exec = self.post_exec </span><span class="cx"> self.logger = engine.logger </span><span class="cx"> self.set_assert_list(None, None) </span><span class="cx"> self.sql_count = 0 </span><del>- def __getattr__(self, key): - return getattr(self.engine, key) </del><ins>+ def get_engine(self): + return self._engine + def set_engine(self, e): + self._engine = e +# def __getattr__(self, key): + # return getattr(self.engine, key) </ins><span class="cx"> def set_assert_list(self, unittest, list): </span><span class="cx"> self.unittest = unittest </span><span class="cx"> self.assert_list = list </span></span></pre></div> <a id="sqlalchemytrunktesttesttypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/testtypes.py (1075 => 1076)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/testtypes.py 2006-03-02 00:30:49 UTC (rev 1075) +++ sqlalchemy/trunk/test/testtypes.py 2006-03-02 00:38:16 UTC (rev 1076) </span><span class="lines">@@ -67,7 +67,7 @@ </span><span class="cx"> 'float_column': 'float_column NUMERIC(25, 2)' </span><span class="cx"> } </span><span class="cx"> </span><del>- if not db.engine.__module__.endswith('sqlite'): </del><ins>+ if not db.name=='sqlite': </ins><span class="cx"> expectedResults['float_column'] = 'float_column FLOAT(25)' </span><span class="cx"> </span><span class="cx"> print db.engine.__module__ </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-02 00:31:00
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1075] sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py: engine property allows polymorphic access to get_engine/set_engine</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1075</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 18:30:49 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>engine property allows polymorphic access to get_engine/set_engine</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyextproxypy">sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyextproxypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py (1074 => 1075)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-03-02 00:06:53 UTC (rev 1074) +++ sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-03-02 00:30:49 UTC (rev 1075) </span><span class="lines">@@ -20,7 +20,7 @@ </span><span class="cx"> def set_engine(self, engine): </span><span class="cx"> raise NotImplementedError </span><span class="cx"> </span><del>- engine = property(get_engine, set_engine) </del><ins>+ engine = property(lambda s:s.get_engine(), lambda s,e:s.set_engine(e)) </ins><span class="cx"> </span><span class="cx"> def reflecttable(self, table): </span><span class="cx"> return self.get_engine().reflecttable(table) </span><span class="lines">@@ -71,10 +71,6 @@ </span><span class="cx"> self._engine= create_engine( dburi, self.opts, **self.kwargs ) </span><span class="cx"> return self._engine </span><span class="cx"> </span><del>- def set_engine(self, engine): - raise NotImplementedError - - engine = property(get_engine, set_engine) </del><span class="cx"> </span><span class="cx"> </span><span class="cx"> class ProxyEngine(BaseProxyEngine): </span><span class="lines">@@ -119,8 +115,6 @@ </span><span class="cx"> def set_engine(self, engine): </span><span class="cx"> self.storage.engine = engine </span><span class="cx"> </span><del>- engine = property(get_engine, set_engine) - </del><span class="cx"> </span><span class="cx"> class ProxyType(object): </span><span class="cx"> """ProxyType base class; used by ProxyTypeEngine to construct proxying </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-02 00:07:04
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1074] sqlalchemy/trunk/lib/sqlalchemy/types.py: got unicode to do None...</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1074</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 18:06:53 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>got unicode to do None...</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemytypespy">sqlalchemy/trunk/lib/sqlalchemy/types.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemytypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/types.py (1073 => 1074)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-03-01 21:20:59 UTC (rev 1073) +++ sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-03-02 00:06:53 UTC (rev 1074) </span><span class="lines">@@ -95,12 +95,12 @@ </span><span class="cx"> else: </span><span class="cx"> return self </span><span class="cx"> def convert_bind_param(self, value, engine): </span><del>- if not engine.convert_unicode or not isinstance(value, unicode): </del><ins>+ if not engine.convert_unicode or value is None or not isinstance(value, unicode): </ins><span class="cx"> return value </span><span class="cx"> else: </span><span class="cx"> return value.encode('utf-8') </span><span class="cx"> def convert_result_value(self, value, engine): </span><del>- if not engine.convert_unicode or isinstance(value, unicode): </del><ins>+ if not engine.convert_unicode or value is None or isinstance(value, unicode): </ins><span class="cx"> return value </span><span class="cx"> else: </span><span class="cx"> return value.decode('utf-8') </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-01 21:21:13
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1073] sqlalchemy/trunk/test: made SchemaEngine more prominent as the base of Table association</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1073</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 15:20:59 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>made SchemaEngine more prominent as the base of Table association BaseProxyEngine descends from SchemaEngine fixes to sqlite/postgres reflection to use the correct engine for table lookups Table engine can be none which will default to schema.default_engine (although its still positional for now, so still needs to be explicit to make room for Columns) __init__ sets default_engine to be a blank ProxyEngine fixes to test suite to allow --db proxy.<dbname> to really test proxyengine</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemy__init__py">sqlalchemy/trunk/lib/sqlalchemy/__init__.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasespostgrespy">sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasessqlitepy">sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyextproxypy">sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyschemapy">sqlalchemy/trunk/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemytrunktestenginespy">sqlalchemy/trunk/test/engines.py</a></li> <li><a href="#sqlalchemytrunktestinheritancepy">sqlalchemy/trunk/test/inheritance.py</a></li> <li><a href="#sqlalchemytrunktestquerypy">sqlalchemy/trunk/test/query.py</a></li> <li><a href="#sqlalchemytrunktesttestbasepy">sqlalchemy/trunk/test/testbase.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemy__init__py"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/__init__.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/__init__.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/lib/sqlalchemy/__init__.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -11,3 +11,7 @@ </span><span class="cx"> from exceptions import * </span><span class="cx"> import mapping as mapperlib </span><span class="cx"> from mapping import * </span><ins>+ +import sqlalchemy.schema +import sqlalchemy.ext.proxy +sqlalchemy.schema.default_engine = sqlalchemy.ext.proxy.ProxyEngine() </ins></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -199,7 +199,7 @@ </span><span class="cx"> self.opts['port'] = str(self.opts['port']) </span><span class="cx"> </span><span class="cx"> ansisql.ANSISQLEngine.__init__(self, **params) </span><del>- </del><ins>+ </ins><span class="cx"> def connect_args(self): </span><span class="cx"> return [[], self.opts] </span><span class="cx"> </span><span class="lines">@@ -277,7 +277,9 @@ </span><span class="cx"> else: </span><span class="cx"> ischema_names = pg1_ischema_names </span><span class="cx"> </span><del>- ischema.reflecttable(self, table, ischema_names) </del><ins>+ # give ischema the given table's engine with which to look up + # other tables, not 'self', since it could be a ProxyEngine + ischema.reflecttable(table.engine, table, ischema_names) </ins><span class="cx"> </span><span class="cx"> class PGCompiler(ansisql.ANSICompiler): </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasessqlitepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -182,7 +182,9 @@ </span><span class="cx"> break </span><span class="cx"> (tablename, localcol, remotecol) = (row[2], row[3], row[4]) </span><span class="cx"> #print "row! " + repr(row) </span><del>- remotetable = Table(tablename, self, autoload = True) </del><ins>+ # look up the table based on the given table's engine, not 'self', + # since it could be a ProxyEngine + remotetable = Table(tablename, table.engine, autoload = True) </ins><span class="cx"> table.c[localcol].append_item(schema.ForeignKey(remotetable.c[remotecol])) </span><span class="cx"> # check for UNIQUE indexes </span><span class="cx"> c = self.execute("PRAGMA index_list(" + table.name + ")", {}) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/engine.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -172,6 +172,7 @@ </span><span class="cx"> # get a handle on the connection pool via the connect arguments </span><span class="cx"> # this insures the SQLEngine instance integrates with the pool referenced </span><span class="cx"> # by direct usage of pool.manager(<module>).connect(*args, **params) </span><ins>+ schema.SchemaEngine.__init__(self) </ins><span class="cx"> (cargs, cparams) = self.connect_args() </span><span class="cx"> if pool is None: </span><span class="cx"> params['echo'] = echo_pool </span><span class="lines">@@ -183,7 +184,6 @@ </span><span class="cx"> self.echo_uow = echo_uow </span><span class="cx"> self.convert_unicode = convert_unicode </span><span class="cx"> self.context = util.ThreadLocal(raiseerror=False) </span><del>- self.tables = {} </del><span class="cx"> self._ischema = None </span><span class="cx"> self._figure_paramstyle() </span><span class="cx"> if logger is None: </span><span class="lines">@@ -204,6 +204,10 @@ </span><span class="cx"> </span><span class="cx"> def hash_key(self): </span><span class="cx"> return "%s(%s)" % (self.__class__.__name__, repr(self.connect_args())) </span><ins>+ + def _get_name(self): + return sys.modules[self.__module__].descriptor()['name'] + name = property(_get_name) </ins><span class="cx"> </span><span class="cx"> def dispose(self): </span><span class="cx"> """disposes of the underlying pool manager for this SQLEngine.""" </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyextproxypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -6,16 +6,14 @@ </span><span class="cx"> from sqlalchemy import sql </span><span class="cx"> from sqlalchemy.engine import create_engine </span><span class="cx"> from sqlalchemy.types import TypeEngine </span><del>- </del><ins>+import sqlalchemy.schema as schema </ins><span class="cx"> import thread, weakref </span><span class="cx"> </span><del>-class BaseProxyEngine(object): </del><ins>+class BaseProxyEngine(schema.SchemaEngine): </ins><span class="cx"> ''' </span><span class="cx"> Basis for all proxy engines </span><span class="cx"> ''' </span><del>- def __init__(self): - self.tables = {} - </del><ins>+ </ins><span class="cx"> def get_engine(self): </span><span class="cx"> raise NotImplementedError </span><span class="cx"> </span><span class="lines">@@ -24,6 +22,9 @@ </span><span class="cx"> </span><span class="cx"> engine = property(get_engine, set_engine) </span><span class="cx"> </span><ins>+ def reflecttable(self, table): + return self.get_engine().reflecttable(table) + </ins><span class="cx"> def hash_key(self): </span><span class="cx"> return "%s(%s)" % (self.__class__.__name__, id(self)) </span><span class="cx"> </span><span class="lines">@@ -83,16 +84,20 @@ </span><span class="cx"> classes for TypeEngine. </span><span class="cx"> """ </span><span class="cx"> </span><del>- def __init__(self): </del><ins>+ def __init__(self, **kwargs): </ins><span class="cx"> BaseProxyEngine.__init__(self) </span><span class="cx"> # create the local storage for uri->engine map and current engine </span><span class="cx"> self.storage = local() </span><span class="cx"> self.storage.connection = {} </span><span class="cx"> self.storage.engine = None </span><ins>+ self.kwargs = kwargs </ins><span class="cx"> </span><span class="cx"> def connect(self, uri, opts=None, **kwargs): </span><span class="cx"> """Establish connection to a real engine. </span><span class="cx"> """ </span><ins>+ kw = self.kwargs.copy() + kw.update(kwargs) + kwargs = kw </ins><span class="cx"> key = "%s(%s,%s)" % (uri, repr(opts), repr(kwargs)) </span><span class="cx"> try: </span><span class="cx"> map = self.storage.connection </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/schema.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -45,8 +45,10 @@ </span><span class="cx"> </span><span class="cx"> class TableSingleton(type): </span><span class="cx"> """a metaclass used by the Table object to provide singleton behavior.""" </span><del>- def __call__(self, name, engine, *args, **kwargs): </del><ins>+ def __call__(self, name, engine=None, *args, **kwargs): </ins><span class="cx"> try: </span><ins>+ if engine is None: + engine = default_engine </ins><span class="cx"> name = str(name) # in case of incoming unicode </span><span class="cx"> schema = kwargs.get('schema', None) </span><span class="cx"> autoload = kwargs.pop('autoload', False) </span><span class="lines">@@ -146,7 +148,6 @@ </span><span class="cx"> metaclass constructor.""" </span><span class="cx"> self._clear() </span><span class="cx"> </span><del>- print "RELOAD VALUES", args </del><span class="cx"> self._init_items(*args) </span><span class="cx"> </span><span class="cx"> def append_item(self, item): </span><span class="lines">@@ -383,7 +384,7 @@ </span><span class="cx"> if isinstance(self._colspec, str): </span><span class="cx"> return self._colspec </span><span class="cx"> elif self._colspec.table.schema is not None: </span><del>- return "%s.%s.%s" % (self._colspec.table.schema, self._colspec.table.name, self._colspec.column.key) </del><ins>+ return "%s.%s.%s" % (self._colspec.table.schema, self._colspec.table.name, self._colspec.key) </ins><span class="cx"> else: </span><span class="cx"> return "%s.%s" % (self._colspec.table.name, self._colspec.key) </span><span class="cx"> </span><span class="lines">@@ -412,7 +413,6 @@ </span><span class="cx"> self._column = table.c[colname] </span><span class="cx"> else: </span><span class="cx"> self._column = self._colspec </span><del>- </del><span class="cx"> return self._column </span><span class="cx"> </span><span class="cx"> column = property(lambda s: s._init_column()) </span><span class="lines">@@ -540,6 +540,11 @@ </span><span class="cx"> class SchemaEngine(object): </span><span class="cx"> """a factory object used to create implementations for schema objects. This object </span><span class="cx"> is the ultimate base class for the engine.SQLEngine class.""" </span><ins>+ + def __init__(self): + # a dictionary that stores Table objects keyed off their name (and possibly schema name) + self.tables = {} + </ins><span class="cx"> def reflecttable(self, table): </span><span class="cx"> """given a table, will query the database and populate its Column and ForeignKey </span><span class="cx"> objects.""" </span></span></pre></div> <a id="sqlalchemytrunktestenginespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/engines.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/engines.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/test/engines.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -58,8 +58,6 @@ </span><span class="cx"> mysql_engine='InnoDB' </span><span class="cx"> ) </span><span class="cx"> </span><del>- print repr(users) - print repr(addresses) </del><span class="cx"> </span><span class="cx"> # users.c.parent_user_id.set_foreign_key(ForeignKey(users.c.user_id)) </span><span class="cx"> </span><span class="lines">@@ -69,14 +67,14 @@ </span><span class="cx"> # clear out table registry </span><span class="cx"> users.deregister() </span><span class="cx"> addresses.deregister() </span><del>- </del><ins>+ </ins><span class="cx"> try: </span><span class="cx"> users = Table('engine_users', testbase.db, autoload = True) </span><span class="cx"> addresses = Table('engine_email_addresses', testbase.db, autoload = True) </span><span class="cx"> finally: </span><span class="cx"> addresses.drop() </span><span class="cx"> users.drop() </span><del>- </del><ins>+ </ins><span class="cx"> users.create() </span><span class="cx"> addresses.create() </span><span class="cx"> try: </span><span class="lines">@@ -86,6 +84,8 @@ </span><span class="cx"> # we can now as long as we use InnoDB </span><span class="cx"> # if testbase.db.engine.__module__.endswith('mysql'): </span><span class="cx"> # addresses.c.remote_user_id.append_item(ForeignKey('engine_users.user_id')) </span><ins>+ print users + print addresses </ins><span class="cx"> j = join(users, addresses) </span><span class="cx"> print str(j.onclause) </span><span class="cx"> self.assert_((users.c.user_id==addresses.c.remote_user_id).compare(j.onclause)) </span></span></pre></div> <a id="sqlalchemytrunktestinheritancepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/inheritance.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/inheritance.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/test/inheritance.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -139,8 +139,10 @@ </span><span class="cx"> b = Bar('barfoo') </span><span class="cx"> objectstore.commit() </span><span class="cx"> </span><del>- b.foos.append(Foo('subfoo1')) - b.foos.append(Foo('subfoo2')) </del><ins>+ f1 = Foo('subfoo1') + f2 = Foo('subfoo2') + b.foos.append(f1) + b.foos.append(f2) </ins><span class="cx"> </span><span class="cx"> objectstore.commit() </span><span class="cx"> objectstore.clear() </span><span class="lines">@@ -150,7 +152,7 @@ </span><span class="cx"> print l[0].foos </span><span class="cx"> self.assert_result(l, Bar, </span><span class="cx"> # {'id':1, 'data':'barfoo', 'bid':1, 'foos':(Foo, [{'id':2,'data':'subfoo1'}, {'id':3,'data':'subfoo2'}])}, </span><del>- {'id':1, 'data':'barfoo', 'foos':(Foo, [{'id':2,'data':'subfoo1'}, {'id':3,'data':'subfoo2'}])}, </del><ins>+ {'id':b.id, 'data':'barfoo', 'foos':(Foo, [{'id':f1.id,'data':'subfoo1'}, {'id':f2.id,'data':'subfoo2'}])}, </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunktestquerypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/query.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/query.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/test/query.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -47,7 +47,7 @@ </span><span class="cx"> that PassiveDefault upon insert, even though PassiveDefault says </span><span class="cx"> "let the database execute this", because in postgres we must have all the primary </span><span class="cx"> key values in memory before insert; otherwise we cant locate the just inserted row.""" </span><del>- if not db.engine.__module__.endswith('postgres'): </del><ins>+ if db.engine.name != 'postgres': </ins><span class="cx"> return </span><span class="cx"> try: </span><span class="cx"> db.execute(""" </span><span class="lines">@@ -96,8 +96,8 @@ </span><span class="cx"> x['x'] += 1 </span><span class="cx"> return x['x'] </span><span class="cx"> </span><del>- use_function_defaults = db.engine.__module__.endswith('postgres') or db.engine.__module__.endswith('oracle') - is_oracle = db.engine.__module__.endswith('oracle') </del><ins>+ use_function_defaults = db.engine.name == 'postgres' or db.engine.name == 'oracle' + is_oracle = db.engine.name == 'oracle' </ins><span class="cx"> </span><span class="cx"> # select "count(1)" from the DB which returns different results </span><span class="cx"> # on different DBs </span></span></pre></div> <a id="sqlalchemytrunktesttestbasepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/testbase.py (1072 => 1073)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/testbase.py 2006-03-01 19:43:07 UTC (rev 1072) +++ sqlalchemy/trunk/test/testbase.py 2006-03-01 21:20:59 UTC (rev 1073) </span><span class="lines">@@ -1,6 +1,7 @@ </span><span class="cx"> import unittest </span><span class="cx"> import StringIO </span><span class="cx"> import sqlalchemy.engine as engine </span><ins>+import sqlalchemy.ext.proxy </ins><span class="cx"> import re, sys </span><span class="cx"> </span><span class="cx"> echo = True </span><span class="lines">@@ -15,14 +16,22 @@ </span><span class="cx"> global db, db_uri </span><span class="cx"> </span><span class="cx"> DBTYPE = 'sqlite' </span><del>- </del><ins>+ PROXY = False + </ins><span class="cx"> if len(sys.argv) >= 3: </span><span class="cx"> if sys.argv[1] == '--dburi': </span><span class="cx"> (param, db_uri) = (sys.argv.pop(1), sys.argv.pop(1)) </span><span class="cx"> elif sys.argv[1] == '--db': </span><span class="cx"> (param, DBTYPE) = (sys.argv.pop(1), sys.argv.pop(1)) </span><span class="cx"> </span><ins>+ </ins><span class="cx"> if (None == db_uri): </span><ins>+ p = DBTYPE.split('.') + if len(p) > 1: + arg = p[0] + DBTYPE = p[1] + if arg == 'proxy': + PROXY = True </ins><span class="cx"> if DBTYPE == 'sqlite': </span><span class="cx"> db_uri = 'sqlite://filename=:memory:' </span><span class="cx"> elif DBTYPE == 'sqlite_file': </span><span class="lines">@@ -37,7 +46,11 @@ </span><span class="cx"> if not db_uri: </span><span class="cx"> raise "Could not create engine. specify --db <sqlite|sqlite_file|postgres|mysql|oracle> to test runner." </span><span class="cx"> </span><del>- db = engine.create_engine(db_uri, echo=echo, default_ordering=True) </del><ins>+ if PROXY: + db = sqlalchemy.ext.proxy.ProxyEngine(echo=echo, default_ordering=True) + db.connect(db_uri) + else: + db = engine.create_engine(db_uri, echo=echo, default_ordering=True) </ins><span class="cx"> db = EngineAssert(db) </span><span class="cx"> </span><span class="cx"> class PersistTest(unittest.TestCase): </span><span class="lines">@@ -75,7 +88,7 @@ </span><span class="cx"> else: </span><span class="cx"> self.assert_(getattr(rowobj, key) == value, "attribute %s value %s does not match %s" % (key, getattr(rowobj, key), value)) </span><span class="cx"> def assert_sql(self, db, callable_, list, with_sequences=None): </span><del>- if with_sequences is not None and (db.engine.__module__.endswith('postgres') or db.engine.__module__.endswith('oracle')): </del><ins>+ if with_sequences is not None and (db.engine.name == 'postgres' or db.engine.name == 'oracle'): </ins><span class="cx"> db.set_assert_list(self, with_sequences) </span><span class="cx"> else: </span><span class="cx"> db.set_assert_list(self, list) </span><span class="lines">@@ -89,13 +102,13 @@ </span><span class="cx"> callable_() </span><span class="cx"> finally: </span><span class="cx"> self.assert_(db.sql_count == count, "desired statement count %d does not match %d" % (count, db.sql_count)) </span><del>- </del><ins>+ </ins><span class="cx"> class EngineAssert(object): </span><span class="cx"> """decorates a SQLEngine object to match the incoming queries against a set of assertions.""" </span><span class="cx"> def __init__(self, engine): </span><span class="cx"> self.engine = engine </span><span class="cx"> self.realexec = engine.post_exec </span><del>- engine.post_exec = self.post_exec </del><ins>+ self.realexec.im_self.post_exec = self.post_exec </ins><span class="cx"> self.logger = engine.logger </span><span class="cx"> self.set_assert_list(None, None) </span><span class="cx"> self.sql_count = 0 </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-01 19:43:20
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1072] sqlalchemy/trunk: postgres leaves parenthesis off functions only for no-argument ANSI functions according to a list</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1072</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 13:43:07 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>postgres leaves parenthesis off functions only for no-argument ANSI functions according to a list</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasespostgrespy">sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1071 => 1072)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-03-01 09:37:45 UTC (rev 1071) +++ sqlalchemy/trunk/CHANGES 2006-03-01 19:43:07 UTC (rev 1072) </span><span class="lines">@@ -25,7 +25,8 @@ </span><span class="cx"> - added "convert_unicode" flag to SQLEngine, will treat all String/CHAR types </span><span class="cx"> as Unicode types, with raw-byte/utf-8 translation on the bind parameter and </span><span class="cx"> result set side. </span><del>- </del><ins>+- postgres maintains a list of ANSI functions that must have no parenthesis so +function calls with no arguments work consistently </ins><span class="cx"> 0.1.2 </span><span class="cx"> - fixed a recursive call in schema that was somehow running 994 times then returning </span><span class="cx"> normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py (1071 => 1072)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-03-01 09:37:45 UTC (rev 1071) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-03-01 19:43:07 UTC (rev 1072) </span><span class="lines">@@ -6,6 +6,7 @@ </span><span class="cx"> </span><span class="cx"> import sys, StringIO, string, types, re </span><span class="cx"> </span><ins>+import sqlalchemy.util as util </ins><span class="cx"> import sqlalchemy.sql as sql </span><span class="cx"> import sqlalchemy.engine as engine </span><span class="cx"> import sqlalchemy.schema as schema </span><span class="lines">@@ -101,7 +102,18 @@ </span><span class="cx"> class PGBoolean(sqltypes.Boolean): </span><span class="cx"> def get_col_spec(self): </span><span class="cx"> return "BOOLEAN" </span><del>- </del><ins>+ +ANSI_FUNCS = util.HashSet([ +'CURRENT_TIME', +'CURRENT_TIMESTAMP', +'CURRENT_DATE', +'LOCAL_TIME', +'LOCAL_TIMESTAMP', +'CURRENT_USER', +'SESSION_USER', +'USER' +]) + </ins><span class="cx"> pg2_colspecs = { </span><span class="cx"> sqltypes.Integer : PGInteger, </span><span class="cx"> sqltypes.Smallinteger : PGSmallInteger, </span><span class="lines">@@ -270,10 +282,11 @@ </span><span class="cx"> class PGCompiler(ansisql.ANSICompiler): </span><span class="cx"> </span><span class="cx"> def visit_function(self, func): </span><del>- if len(func.clauses): </del><ins>+ # PG has a bunch of funcs that explicitly need no parenthesis + if func.name.upper() in ANSI_FUNCS and not len(func.clauses): + self.strings[func] = func.name + else: </ins><span class="cx"> super(PGCompiler, self).visit_function(func) </span><del>- else: - self.strings[func] = func.name </del><span class="cx"> </span><span class="cx"> def visit_insert_column(self, column): </span><span class="cx"> # Postgres advises against OID usage and turns it off in 8.1, </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-01 09:38:16
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1071] sqlalchemy/trunk: Modified mysql to not add AUTOINCREMENT to the first integer primary key if it is also a foreign key.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1071</dd> <dt>Author</dt> <dd>rtl</dd> <dt>Date</dt> <dd>2006-03-01 03:37:45 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>Modified mysql to not add AUTOINCREMENT to the first integer primary key if it is also a foreign key.</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesmysqlpy">sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py</a></li> </ul> <h3>Property Changed</h3> <ul> <li>sqlalchemy/trunk/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunk"></a> <div class="propset"><h4>Property changes: sqlalchemy/trunk</h4> <pre class="diff"><span> <span class="cx">Name: svk:merge </span><span class="cx"> - 8b31e7cb-c107-0410-ae80-e86de58984b7:/local/sqlalchemy:2165 </span><span class="cx"> + 8b31e7cb-c107-0410-ae80-e86de58984b7:/local/sqlalchemy:2426 </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesmysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py (1070 => 1071)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py 2006-03-01 07:22:53 UTC (rev 1070) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py 2006-03-01 09:37:45 UTC (rev 1071) </span><span class="lines">@@ -261,7 +261,7 @@ </span><span class="cx"> if column.primary_key: </span><span class="cx"> if not override_pk: </span><span class="cx"> colspec += " PRIMARY KEY" </span><del>- if first_pk and isinstance(column.type, types.Integer): </del><ins>+ if not column.foreign_key and first_pk and isinstance(column.type, types.Integer): </ins><span class="cx"> colspec += " AUTO_INCREMENT" </span><span class="cx"> if column.foreign_key: </span><span class="cx"> colspec += ", FOREIGN KEY (%s) REFERENCES %s(%s)" % (column.name, column.foreign_key.column.table.name, column.foreign_key.column.name) </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-01 07:23:10
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1070] sqlalchemy/trunk/test: added schema support for postgres column defaults, fix for [ticket:88]</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1070</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 01:22:53 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added schema support for postgres column defaults, fix for [ticket:88]</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemydatabasespostgrespy">sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py</a></li> <li><a href="#sqlalchemytrunktestquerypy">sqlalchemy/trunk/test/query.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py (1069 => 1070)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-03-01 00:11:25 UTC (rev 1069) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-03-01 07:22:53 UTC (rev 1070) </span><span class="lines">@@ -338,7 +338,12 @@ </span><span class="cx"> c = self.proxy("select %s" % column.default.arg) </span><span class="cx"> return c.fetchone()[0] </span><span class="cx"> elif isinstance(column.type, types.Integer) and (column.default is None or (isinstance(column.default, schema.Sequence) and column.default.optional)): </span><del>- c = self.proxy("select nextval('%s_%s_seq')" % (column.table.name, column.name)) </del><ins>+ sch = column.table.schema + if sch is not None: + exc = "select nextval('%s.%s_%s_seq')" % (sch, column.table.name, column.name) + else: + exc = "select nextval('%s_%s_seq')" % (column.table.name, column.name) + c = self.proxy(exc) </ins><span class="cx"> return c.fetchone()[0] </span><span class="cx"> else: </span><span class="cx"> return ansisql.ANSIDefaultRunner.get_column_default(self, column) </span></span></pre></div> <a id="sqlalchemytrunktestquerypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/query.py (1069 => 1070)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/query.py 2006-03-01 00:11:25 UTC (rev 1069) +++ sqlalchemy/trunk/test/query.py 2006-03-01 07:22:53 UTC (rev 1070) </span><span class="lines">@@ -67,6 +67,29 @@ </span><span class="cx"> self.assert_(l == [(1, 'user', 'lala')]) </span><span class="cx"> finally: </span><span class="cx"> db.execute("drop table speedy_users", None) </span><ins>+ + def testschema(self): + if not db.engine.__module__.endswith('postgres'): + return + + test_table = Table('my_table', db, + Column('id', Integer, primary_key=True), + Column('data', String(20), nullable=False), + schema='alt_schema' + ) + test_table.create() + try: + # plain insert + test_table.insert().execute(data='test') + + # try with a PassiveDefault + test_table.deregister() + test_table = Table('my_table', db, autoload=True, redefine=True, schema='alt_schema') + test_table.insert().execute(data='test') + + finally: + test_table.drop() + </ins><span class="cx"> def testdefaults(self): </span><span class="cx"> x = {'x':50} </span><span class="cx"> def mydefault(): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-01 00:11:35
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1069] sqlalchemy/trunk/CHANGES: update</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1069</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-28 18:11:25 -0600 (Tue, 28 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>update</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1068 => 1069)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-03-01 00:08:01 UTC (rev 1068) +++ sqlalchemy/trunk/CHANGES 2006-03-01 00:11:25 UTC (rev 1069) </span><span class="lines">@@ -22,6 +22,9 @@ </span><span class="cx"> check when object attributes are modified or the object is deleted </span><span class="cx"> - Index object fully implemented, can be constructed standalone, or via </span><span class="cx"> "index" and "unique" arguments on Columns. </span><ins>+- added "convert_unicode" flag to SQLEngine, will treat all String/CHAR types +as Unicode types, with raw-byte/utf-8 translation on the bind parameter and +result set side. </ins><span class="cx"> </span><span class="cx"> 0.1.2 </span><span class="cx"> - fixed a recursive call in schema that was somehow running 994 times then returning </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-01 00:08:12
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1068] sqlalchemy/trunk/test: added convert_unicode flag to engine + unittest, does unicode in/out translation on all string/char values when set</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1068</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-28 18:08:01 -0600 (Tue, 28 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>added convert_unicode flag to engine + unittest, does unicode in/out translation on all string/char values when set</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcontentdbenginemyt">sqlalchemy/trunk/doc/build/content/dbengine.myt</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasespostgrespy">sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemytypespy">sqlalchemy/trunk/lib/sqlalchemy/types.py</a></li> <li><a href="#sqlalchemytrunktesttesttypespy">sqlalchemy/trunk/test/testtypes.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocbuildcontentdbenginemyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/dbengine.myt (1067 => 1068)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/dbengine.myt 2006-02-28 23:33:15 UTC (rev 1067) +++ sqlalchemy/trunk/doc/build/content/dbengine.myt 2006-03-01 00:08:01 UTC (rev 1068) </span><span class="lines">@@ -102,6 +102,7 @@ </span><span class="cx"> <li>default_ordering=False : if True, table objects and associated joins and aliases will generate information used for ordering by primary keys (or OIDs, if the database supports OIDs). This information is used by the Mapper system to when it constructs select queries to supply a default ordering to mapped objects.</li> </span><span class="cx"> <li>use_ansi=True : used only by Oracle; when False, the Oracle driver attempts to support a particular "quirk" of some Oracle databases, that the LEFT OUTER JOIN SQL syntax is not supported, and the "Oracle join" syntax of using <% "<column1>(+)=<column2>" |h%> must be used in order to achieve a LEFT OUTER JOIN. Its advised that the Oracle database be configured to have full ANSI support instead of using this feature.</li> </span><span class="cx"> <li>use_oids=False : used only by Postgres, will enable the column name "oid" as the object ID column. Postgres as of 8.1 has object IDs disabled by default.</li> </span><ins>+ <li>convert_unicode=False : if set to True, all String/character based types will convert Unicode values to raw byte values going into the database, and all raw byte values to Python Unicode coming out in result sets. This is an engine-wide method to provide unicode across the board. For unicode conversion on a column-by-column level, use the Unicode column type instead.</li> </ins><span class="cx"> </ul> </span><span class="cx"> </&> </span><span class="cx"> <&|doclib.myt:item, name="proxy", description="Using the Proxy Engine" &> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py (1067 => 1068)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-02-28 23:33:15 UTC (rev 1067) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-03-01 00:08:01 UTC (rev 1068) </span><span class="lines">@@ -85,6 +85,7 @@ </span><span class="cx"> return value </span><span class="cx"> def get_col_spec(self): </span><span class="cx"> return "TIME" </span><ins>+ </ins><span class="cx"> class PGText(sqltypes.TEXT): </span><span class="cx"> def get_col_spec(self): </span><span class="cx"> return "TEXT" </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/engine.py (1067 => 1068)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-02-28 23:33:15 UTC (rev 1067) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-01 00:08:01 UTC (rev 1068) </span><span class="lines">@@ -166,7 +166,7 @@ </span><span class="cx"> SQLEngines are constructed via the create_engine() function inside this package. </span><span class="cx"> """ </span><span class="cx"> </span><del>- def __init__(self, pool=None, echo=False, logger=None, default_ordering=False, echo_pool=False, echo_uow=False, **params): </del><ins>+ def __init__(self, pool=None, echo=False, logger=None, default_ordering=False, echo_pool=False, echo_uow=False, convert_unicode=False, **params): </ins><span class="cx"> """constructs a new SQLEngine. SQLEngines should be constructed via the create_engine() </span><span class="cx"> function which will construct the appropriate subclass of SQLEngine.""" </span><span class="cx"> # get a handle on the connection pool via the connect arguments </span><span class="lines">@@ -181,6 +181,7 @@ </span><span class="cx"> self.default_ordering=default_ordering </span><span class="cx"> self.echo = echo </span><span class="cx"> self.echo_uow = echo_uow </span><ins>+ self.convert_unicode = convert_unicode </ins><span class="cx"> self.context = util.ThreadLocal(raiseerror=False) </span><span class="cx"> self.tables = {} </span><span class="cx"> self._ischema = None </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemytypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/types.py (1067 => 1068)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-02-28 23:33:15 UTC (rev 1067) +++ sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-03-01 00:08:01 UTC (rev 1068) </span><span class="lines">@@ -94,6 +94,16 @@ </span><span class="cx"> return TEXT() </span><span class="cx"> else: </span><span class="cx"> return self </span><ins>+ def convert_bind_param(self, value, engine): + if not engine.convert_unicode or not isinstance(value, unicode): + return value + else: + return value.encode('utf-8') + def convert_result_value(self, value, engine): + if not engine.convert_unicode or isinstance(value, unicode): + return value + else: + return value.decode('utf-8') </ins><span class="cx"> </span><span class="cx"> class Unicode(TypeDecorator,String): </span><span class="cx"> def __init__(self, length=None): </span></span></pre></div> <a id="sqlalchemytrunktesttesttypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/testtypes.py (1067 => 1068)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/testtypes.py 2006-02-28 23:33:15 UTC (rev 1067) +++ sqlalchemy/trunk/test/testtypes.py 2006-03-01 00:08:01 UTC (rev 1068) </span><span class="lines">@@ -108,7 +108,21 @@ </span><span class="cx"> self.echo("its sqlite !") </span><span class="cx"> else: </span><span class="cx"> self.assert_(not isinstance(x['plain_data'], unicode) and x['plain_data'] == rawdata) </span><del>- </del><ins>+ def testengineparam(self): + """tests engine-wide unicode conversion""" + prev_unicode = db.engine.convert_unicode + try: + db.engine.convert_unicode = True + rawdata = 'Alors vous imaginez ma surprise, au lever du jour, quand une dr\xc3\xb4le de petit voix m\xe2\x80\x99a r\xc3\xa9veill\xc3\xa9. Elle disait: \xc2\xab S\xe2\x80\x99il vous pla\xc3\xaet\xe2\x80\xa6 dessine-moi un mouton! \xc2\xbb\n' + unicodedata = rawdata.decode('utf-8') + unicode_table.insert().execute(unicode_data=unicodedata, plain_data=rawdata) + x = unicode_table.select().execute().fetchone() + self.echo(repr(x['unicode_data'])) + self.echo(repr(x['plain_data'])) + self.assert_(isinstance(x['unicode_data'], unicode) and x['unicode_data'] == unicodedata) + self.assert_(isinstance(x['plain_data'], unicode) and x['plain_data'] == unicodedata) + finally: + db.engine.convert_unicode = prev_unicode </ins><span class="cx"> </span><span class="cx"> class BinaryTest(AssertMixin): </span><span class="cx"> def setUpAll(self): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-28 23:33:28
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1067] sqlalchemy/trunk/lib/sqlalchemy/util.py: small cleanup courtesy j.ellis</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1067</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-28 17:33:15 -0600 (Tue, 28 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>small cleanup courtesy j.ellis</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyutilpy">sqlalchemy/trunk/lib/sqlalchemy/util.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyutilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/util.py (1066 => 1067)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-02-28 23:18:43 UTC (rev 1066) +++ sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-02-28 23:33:15 UTC (rev 1067) </span><span class="lines">@@ -53,13 +53,20 @@ </span><span class="cx"> return repr(obj) </span><span class="cx"> </span><span class="cx"> class OrderedProperties(object): </span><del>- """an object that maintains the order in which attributes are set upon it. - also provides an iterator and a very basic dictionary interface to those attributes. </del><span class="cx"> """ </span><ins>+ An object that maintains the order in which attributes are set upon it. + also provides an iterator and a very basic getitem/setitem interface to those attributes. + + (Not really a dict, since it iterates over values, not keys. Not really + a list, either, since each value must have a key associated; hence there is + no append or extend.) + """ </ins><span class="cx"> def __init__(self): </span><span class="cx"> self.__dict__['_list'] = [] </span><ins>+ def __len__(self): + return len(self._list) </ins><span class="cx"> def keys(self): </span><del>- return self._list </del><ins>+ return list(self._list) </ins><span class="cx"> def get(self, key, default): </span><span class="cx"> return getattr(self, key, default) </span><span class="cx"> def has_key(self, key): </span><span class="lines">@@ -81,8 +88,9 @@ </span><span class="cx"> self._list.append(key) </span><span class="cx"> self.__dict__[key] = object </span><span class="cx"> def clear(self): </span><del>- for key in self._list[:]: - del self[key] </del><ins>+ self.__dict__.clear() + self.__dict__['_list'] = [] + </ins><span class="cx"> class RecursionStack(object): </span><span class="cx"> """a thread-local stack used to detect recursive object traversals.""" </span><span class="cx"> def __init__(self): </span><span class="lines">@@ -109,17 +117,18 @@ </span><span class="cx"> </span><span class="cx"> class OrderedDict(dict): </span><span class="cx"> """A Dictionary that keeps its own internal ordering""" </span><ins>+ </ins><span class="cx"> def __init__(self, values = None): </span><del>- self.list = [] </del><ins>+ self._list = [] </ins><span class="cx"> if values is not None: </span><span class="cx"> for val in values: </span><span class="cx"> self.update(val) </span><span class="cx"> </span><span class="cx"> def keys(self): </span><del>- return self.list </del><ins>+ return list(self._list) </ins><span class="cx"> </span><span class="cx"> def clear(self): </span><del>- self.list = [] </del><ins>+ self._list = [] </ins><span class="cx"> dict.clear(self) </span><span class="cx"> </span><span class="cx"> def update(self, dict): </span><span class="lines">@@ -134,29 +143,29 @@ </span><span class="cx"> return self.__getitem__(key) </span><span class="cx"> </span><span class="cx"> def values(self): </span><del>- return map(lambda key: self[key], self.list) </del><ins>+ return map(lambda key: self[key], self._list) </ins><span class="cx"> </span><span class="cx"> def __iter__(self): </span><del>- return iter(self.list) </del><ins>+ return iter(self._list) </ins><span class="cx"> </span><span class="cx"> def itervalues(self): </span><del>- return iter([self[key] for key in self.list]) </del><ins>+ return iter([self[key] for key in self._list]) </ins><span class="cx"> </span><del>- def iterkeys(self):return self.__iter__() </del><ins>+ def iterkeys(self): return self.__iter__() </ins><span class="cx"> </span><span class="cx"> def iteritems(self): </span><span class="cx"> return iter([(key, self[key]) for key in self.keys()]) </span><span class="cx"> </span><span class="cx"> def __delitem__(self, key): </span><span class="cx"> try: </span><del>- del self.list[self.list.index(key)] </del><ins>+ del self._list[self._list.index(key)] </ins><span class="cx"> except ValueError: </span><span class="cx"> raise KeyError(key) </span><span class="cx"> dict.__delitem__(self, key) </span><span class="cx"> </span><span class="cx"> def __setitem__(self, key, object): </span><span class="cx"> if not self.has_key(key): </span><del>- self.list.append(key) </del><ins>+ self._list.append(key) </ins><span class="cx"> dict.__setitem__(self, key, object) </span><span class="cx"> </span><span class="cx"> def __getitem__(self, key): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-28 23:18:53
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1066] sqlalchemy/trunk/test: oid inits at compilation time/when needed again, added a unit test</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1066</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-28 17:18:43 -0600 (Tue, 28 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>oid inits at compilation time/when needed again, added a unit test</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyextproxypy">sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> <li><a href="#sqlalchemytrunktestproxy_enginepy">sqlalchemy/trunk/test/proxy_engine.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyextproxypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py (1065 => 1066)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-02-28 22:50:43 UTC (rev 1065) +++ sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-02-28 23:18:43 UTC (rev 1066) </span><span class="lines">@@ -28,10 +28,8 @@ </span><span class="cx"> return "%s(%s)" % (self.__class__.__name__, id(self)) </span><span class="cx"> </span><span class="cx"> def oid_column_name(self): </span><del>- # NOTE: setting up mappers fails unless the proxy engine returns - # something for oid column name, and the call happens too early - # to proxy, so effecticely no oids are allowed when using - # proxy engine </del><ins>+ # oid_column should not be requested before the engine is connected. + # it should ideally only be called at query compilation time. </ins><span class="cx"> e= self.get_engine() </span><span class="cx"> if e is None: </span><span class="cx"> return None </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1065 => 1066)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-02-28 22:50:43 UTC (rev 1065) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-02-28 23:18:43 UTC (rev 1066) </span><span class="lines">@@ -827,7 +827,9 @@ </span><span class="cx"> else: </span><span class="cx"> self.onclause = onclause </span><span class="cx"> self.isouter = isouter </span><del>- self.oid_column = self.left.oid_column </del><ins>+ + oid_column = property(lambda s:s.left.oid_column) + </ins><span class="cx"> def _exportable_columns(self): </span><span class="cx"> return [c for c in self.left.columns] + [c for c in self.right.columns] </span><span class="cx"> def _proxy_column(self, column): </span><span class="lines">@@ -1001,6 +1003,7 @@ </span><span class="cx"> if self.engine.oid_column_name() is not None: </span><span class="cx"> self._oid_column = schema.Column(self.engine.oid_column_name(), sqltypes.Integer, hidden=True) </span><span class="cx"> self._oid_column._set_parent(self) </span><ins>+ self._orig_columns()[self._oid_column.original] = self._oid_column </ins><span class="cx"> else: </span><span class="cx"> self._oid_column = None </span><span class="cx"> return self._oid_column </span><span class="lines">@@ -1011,9 +1014,6 @@ </span><span class="cx"> self._orig_cols= {} </span><span class="cx"> for c in self.columns: </span><span class="cx"> self._orig_cols[c.original] = c </span><del>- oid = self.oid_column - if oid is not None: - self._orig_cols[oid.original] = oid </del><span class="cx"> return self._orig_cols </span><span class="cx"> columns = property(lambda s:s._columns) </span><span class="cx"> c = property(lambda s:s._columns) </span></span></pre></div> <a id="sqlalchemytrunktestproxy_enginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/proxy_engine.py (1065 => 1066)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/proxy_engine.py 2006-02-28 22:50:43 UTC (rev 1065) +++ sqlalchemy/trunk/test/proxy_engine.py 2006-02-28 23:18:43 UTC (rev 1066) </span><span class="lines">@@ -22,6 +22,17 @@ </span><span class="cx"> pass </span><span class="cx"> </span><span class="cx"> </span><ins>+class ConstructTest(PersistTest): + """tests that we can build SQL constructs without engine-specific parameters, particulary + oid_column, being needed, as the proxy engine is usually not connected yet.""" + def test_join(self): + engine = ProxyEngine() + t = Table('table1', engine, + Column('col1', Integer, primary_key=True)) + t2 = Table('table2', engine, + Column('col2', Integer, ForeignKey('table1.col1'))) + j = join(t, t2) + </ins><span class="cx"> class ProxyEngineTest1(PersistTest): </span><span class="cx"> </span><span class="cx"> def setUp(self): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-28 22:50:59
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1065] sqlalchemy/trunk/test: added items() method to RowProxy + unittest, courtesy dia...@di...</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1065</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-28 16:50:43 -0600 (Tue, 28 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>added items() method to RowProxy + unittest, courtesy dia...@di...</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemytrunktestquerypy">sqlalchemy/trunk/test/query.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/engine.py (1064 => 1065)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-02-28 02:36:09 UTC (rev 1064) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-02-28 22:50:43 UTC (rev 1065) </span><span class="lines">@@ -705,6 +705,8 @@ </span><span class="cx"> return self.__parent._get_col(self.__row, name) </span><span class="cx"> except: </span><span class="cx"> raise AttributeError </span><ins>+ def items(self): + return [(key, getattr(self, key)) for key in self.keys()] </ins><span class="cx"> def keys(self): </span><span class="cx"> return self.__parent.keys </span><span class="cx"> def values(self): </span></span></pre></div> <a id="sqlalchemytrunktestquerypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/query.py (1064 => 1065)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/query.py 2006-02-28 02:36:09 UTC (rev 1064) +++ sqlalchemy/trunk/test/query.py 2006-02-28 22:50:43 UTC (rev 1065) </span><span class="lines">@@ -170,6 +170,11 @@ </span><span class="cx"> r = self.users.select().execute().fetchone() </span><span class="cx"> self.assertEqual(r.keys(), ['user_id', 'user_name']) </span><span class="cx"> </span><ins>+ def test_items(self): + self.users.insert().execute(user_id=1, user_name='foo') + r = self.users.select().execute().fetchone() + self.assertEqual(r.items(), [('user_id', 1), ('user_name', 'foo')]) + </ins><span class="cx"> def test_len(self): </span><span class="cx"> self.users.insert().execute(user_id=1, user_name='foo') </span><span class="cx"> r = self.users.select().execute().fetchone() </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-28 02:36:21
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1064] sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py: took out that "TypeError" wrapper since it blows away stack traces and confuses users</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1064</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-27 20:36:09 -0600 (Mon, 27 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>took out that "TypeError" wrapper since it blows away stack traces and confuses users</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1063 => 1064)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-02-27 16:47:08 UTC (rev 1063) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-02-28 02:36:09 UTC (rev 1064) </span><span class="lines">@@ -219,11 +219,7 @@ </span><span class="cx"> # constructor would otherwise bind it to whatever get_session() is. </span><span class="cx"> session.register_new(self) </span><span class="cx"> if oldinit is not None: </span><del>- try: - oldinit(self, *args, **kwargs) - except TypeError, msg: - # re-raise with the offending class name added to help in debugging - raise TypeError, '%s.%s' %(self.__class__.__name__, msg) </del><ins>+ oldinit(self, *args, **kwargs) </ins><span class="cx"> # override oldinit, insuring that its not already one of our </span><span class="cx"> # own modified inits </span><span class="cx"> if oldinit is None or not hasattr(oldinit, '_sa_mapper_init'): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-27 16:47:18
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1063] sqlalchemy/trunk/lib/sqlalchemy/engine.py: fixed an import</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1063</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-27 10:47:08 -0600 (Mon, 27 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>fixed an import</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/engine.py (1062 => 1063)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-02-27 15:36:48 UTC (rev 1062) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-02-27 16:47:08 UTC (rev 1063) </span><span class="lines">@@ -27,6 +27,7 @@ </span><span class="cx"> import exceptions </span><span class="cx"> import util </span><span class="cx"> import sql </span><ins>+import sqlalchemy.databases </ins><span class="cx"> import sqlalchemy.types as types </span><span class="cx"> import StringIO, sys, re </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-27 15:37:06
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1062] sqlalchemy/trunk/test: Added code to make foreignkey on ActiveMapper accept a string and create the ForeignKey object on the fly.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1062</dd> <dt>Author</dt> <dd>jeff</dd> <dt>Date</dt> <dd>2006-02-27 09:36:48 -0600 (Mon, 27 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>Added code to make foreignkey on ActiveMapper accept a string and create the ForeignKey object on the fly. Also added ability to pass args and kwargs to Column constructor. ActiveMapper columns can have keyword args indexed and unique which will automatically create a index or a unique index. dburi in AutoConnectEngine can be a callable.</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyextactivemapperpy">sqlalchemy/trunk/lib/sqlalchemy/ext/activemapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyextproxypy">sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py</a></li> </ul> <h3>Added Paths</h3> <ul> <li><a href="#sqlalchemytrunktestautoconnect_enginepy">sqlalchemy/trunk/test/autoconnect_engine.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyextactivemapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ext/activemapper.py (1061 => 1062)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ext/activemapper.py 2006-02-27 06:49:09 UTC (rev 1061) +++ sqlalchemy/trunk/lib/sqlalchemy/ext/activemapper.py 2006-02-27 15:36:48 UTC (rev 1062) </span><span class="lines">@@ -1,11 +1,11 @@ </span><span class="cx"> from sqlalchemy import objectstore, create_engine, assign_mapper, relation, mapper </span><span class="cx"> from sqlalchemy import and_, or_ </span><del>-from sqlalchemy import Table, Column </del><ins>+from sqlalchemy import Table, Column, ForeignKey </ins><span class="cx"> from sqlalchemy.ext.proxy import ProxyEngine </span><span class="cx"> </span><span class="cx"> import inspect </span><ins>+import sys </ins><span class="cx"> </span><del>- </del><span class="cx"> # </span><span class="cx"> # the "proxy" to the database engine... this can be swapped out at runtime </span><span class="cx"> # </span><span class="lines">@@ -17,14 +17,19 @@ </span><span class="cx"> # declarative column declaration - this is so that we can infer the colname </span><span class="cx"> # </span><span class="cx"> class column(object): </span><del>- def __init__(self, coltype, colname=None, foreign_key=None, primary_key=False): </del><ins>+ def __init__(self, coltype, colname=None, foreign_key=None, + primary_key=False, *args, **kwargs): + if isinstance( foreign_key, basestring ): + foreign_key= ForeignKey( foreign_key ) </ins><span class="cx"> self.coltype = coltype </span><span class="cx"> self.colname = colname </span><span class="cx"> self.foreign_key = foreign_key </span><span class="cx"> self.primary_key = primary_key </span><ins>+ self.unique = kwargs.pop( 'unique', False ) + self.indexed = kwargs.pop( 'indexed', self.unique ) + self.kwargs = kwargs + self.args = args </ins><span class="cx"> </span><del>- - </del><span class="cx"> # </span><span class="cx"> # declarative relationship declaration </span><span class="cx"> # </span><span class="lines">@@ -89,6 +94,7 @@ </span><span class="cx"> table_name = clsname.lower() </span><span class="cx"> columns = [] </span><span class="cx"> relations = {} </span><ins>+ _engine = getattr( sys.modules[cls.__module__], "__engine__", engine ) </ins><span class="cx"> </span><span class="cx"> if 'mapping' in dict: </span><span class="cx"> members = inspect.getmembers(dict.get('mapping')) </span><span class="lines">@@ -97,6 +103,10 @@ </span><span class="cx"> table_name = value </span><span class="cx"> continue </span><span class="cx"> </span><ins>+ if '__engine__' == name: + _engine= value + continue + </ins><span class="cx"> if name.startswith('__'): continue </span><span class="cx"> </span><span class="cx"> if isinstance(value, column): </span><span class="lines">@@ -104,18 +114,24 @@ </span><span class="cx"> col = Column(value.colname or name, </span><span class="cx"> value.coltype, </span><span class="cx"> value.foreign_key, </span><del>- primary_key=value.primary_key) </del><ins>+ primary_key=value.primary_key, + *value.args, **value.kwargs) </ins><span class="cx"> else: </span><span class="cx"> col = Column(value.colname or name, </span><span class="cx"> value.coltype, </span><del>- primary_key=value.primary_key) </del><ins>+ primary_key=value.primary_key, + *value.args, **value.kwargs) </ins><span class="cx"> columns.append(col) </span><ins>+ if value.indexed: + # create a Index object for the column + index= Index( "%s_idx" % (value.colname or name), + col, unique= value.unique ) </ins><span class="cx"> continue </span><span class="cx"> </span><span class="cx"> if isinstance(value, relationship): </span><span class="cx"> relations[name] = value </span><del>- - cls.table = Table(table_name, engine, *columns) </del><ins>+ assert _engine is not None, "No engine specified" + cls.table = Table(table_name, _engine, *columns) </ins><span class="cx"> assign_mapper(cls, cls.table) </span><span class="cx"> cls.relations = relations </span><span class="cx"> ActiveMapperMeta.classes[clsname] = cls </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyextproxypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py (1061 => 1062)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-02-27 06:49:09 UTC (rev 1061) +++ sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-02-27 15:36:48 UTC (rev 1062) </span><span class="lines">@@ -65,7 +65,11 @@ </span><span class="cx"> </span><span class="cx"> def get_engine(self): </span><span class="cx"> if self._engine is None: </span><del>- self._engine= create_engine( self.dburi, self.opts, **self.kwargs ) </del><ins>+ if callable(self.dburi): + dburi= self.dburi() + else: + dburi= self.dburi + self._engine= create_engine( dburi, self.opts, **self.kwargs ) </ins><span class="cx"> return self._engine </span><span class="cx"> </span><span class="cx"> def set_engine(self, engine): </span></span></pre></div> <a id="sqlalchemytrunktestautoconnect_enginepy"></a> <div class="addfile"><h4>Added: sqlalchemy/trunk/test/autoconnect_engine.py (1061 => 1062)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/autoconnect_engine.py 2006-02-27 06:49:09 UTC (rev 1061) +++ sqlalchemy/trunk/test/autoconnect_engine.py 2006-02-27 15:36:48 UTC (rev 1062) </span><span class="lines">@@ -0,0 +1,90 @@ </span><ins>+from sqlalchemy import * +from sqlalchemy.ext.proxy import AutoConnectEngine + +from testbase import PersistTest +import testbase +import os + +# +# Define an engine, table and mapper at the module level, to show that the +# table and mapper can be used with different real engines in multiple threads +# + + +module_engine = AutoConnectEngine( testbase.db_uri ) +users = Table('users', module_engine, + Column('user_id', Integer, primary_key=True), + Column('user_name', String(16)), + Column('password', String(20)) + ) + +class User(object): + pass + + +class AutoConnectEngineTest1(PersistTest): + + def setUp(self): + clear_mappers() + objectstore.clear() + + def test_engine_connect(self): + users.create() + assign_mapper(User, users) + try: + trans = objectstore.begin() + + user = User() + user.user_name='fred' + user.password='*' + trans.commit() + + # select + sqluser = User.select_by(user_name='fred')[0] + assert sqluser.user_name == 'fred' + + # modify + sqluser.user_name = 'fred jones' + + # commit - saves everything that changed + objectstore.commit() + + allusers = [ user.user_name for user in User.select() ] + assert allusers == [ 'fred jones' ] + finally: + users.drop() + + + + +if __name__ == "__main__": + testbase.main() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + </ins></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-27 06:49:18
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1061] sqlalchemy/trunk/CHANGES: updates</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1061</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-27 00:49:09 -0600 (Mon, 27 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>updates</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1060 => 1061)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-02-27 06:35:46 UTC (rev 1060) +++ sqlalchemy/trunk/CHANGES 2006-02-27 06:49:09 UTC (rev 1061) </span><span class="lines">@@ -1,14 +1,27 @@ </span><span class="cx"> 0.1.3 </span><del>-- fix to Oracle "row_number over" clause with mulitple tables </del><ins>+- completed "post_update" feature, will add a second update statement before inserts +and after deletes in order to reconcile a relationship without any dependencies +being created; used when persisting two rows that are dependent on each other +- completed mapper.using(session) function, localized per-object Session functionality; +objects can be declared and manipulated as local to any user-defined Session +- fix to Oracle "row_number over" clause with multiple tables </ins><span class="cx"> - mapper.get() was not selecting multiple-keyed objects if the mapper's table was a join, </span><span class="cx"> such as in an inheritance relationship, this is fixed. </span><span class="cx"> - overhaul to sql/schema packages so that the sql package can run all on its own, </span><del>-producing selects, inserts, etc. without any engine dependencies. Table/Column -are the "physical" subclasses of TableClause/ColumnClause. -- fixes to mapper inheritance, involving properties that relate to the same table -involved in the mapper inheritance scheme </del><ins>+producing selects, inserts, etc. without any engine dependencies. builds upon +new TableClause/ColumnClause lexical objects. Schema's Table/Column objects +are the "physical" subclasses of them. simplifies schema/sql relationship, +extensions (like proxyengine), and speeds overall performance by a large margin. +removes the entire getattr() behavior that plagued 0.1.1. +- refactoring of how the mapper "synchronizes" data between two objects into a +separate module, works better with properties attached to a mapper that has an +additional inheritance relationship to one of the related tables, also the same +methodology used to synchronize parent/child objects now used by mapper to +synchronize between inherited and inheriting mappers. </ins><span class="cx"> - made objectstore "check for out-of-identitymap" more aggressive, will perform the </span><span class="cx"> check when object attributes are modified or the object is deleted </span><ins>+- Index object fully implemented, can be constructed standalone, or via +"index" and "unique" arguments on Columns. </ins><span class="cx"> </span><span class="cx"> 0.1.2 </span><span class="cx"> - fixed a recursive call in schema that was somehow running 994 times then returning </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-27 06:35:56
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1060] sqlalchemy/trunk/CHANGES: formatting</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1060</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-27 00:35:46 -0600 (Mon, 27 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>formatting</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1059 => 1060)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-02-27 02:33:47 UTC (rev 1059) +++ sqlalchemy/trunk/CHANGES 2006-02-27 06:35:46 UTC (rev 1060) </span><span class="lines">@@ -9,9 +9,11 @@ </span><span class="cx"> involved in the mapper inheritance scheme </span><span class="cx"> - made objectstore "check for out-of-identitymap" more aggressive, will perform the </span><span class="cx"> check when object attributes are modified or the object is deleted </span><ins>+ </ins><span class="cx"> 0.1.2 </span><span class="cx"> - fixed a recursive call in schema that was somehow running 994 times then returning </span><span class="cx"> normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </span><ins>+ </ins><span class="cx"> 0.1.1 </span><span class="cx"> - small fix to Function class so that expressions with a func.foo() use the type of the </span><span class="cx"> Function object (i.e. the left side) as the type of the boolean expression, not the </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-27 02:33:57
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1059] sqlalchemy/trunk/lib/sqlalchemy/mapping: got mapper.using() to work, fixed push/pop mapper, custom session assignments</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1059</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-26 20:33:47 -0600 (Sun, 26 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>got mapper.using() to work, fixed push/pop mapper, custom session assignments</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingobjectstorepy">sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1058 => 1059)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-02-27 01:11:56 UTC (rev 1058) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-02-27 02:33:47 UTC (rev 1059) </span><span class="lines">@@ -213,15 +213,22 @@ </span><span class="cx"> def init(self, *args, **kwargs): </span><span class="cx"> nohist = kwargs.pop('_mapper_nohistory', False) </span><span class="cx"> session = kwargs.pop('_sa_session', objectstore.get_session()) </span><ins>+ if not nohist: + # register new with the correct session, before the object's + # constructor is called, since further assignments within the + # constructor would otherwise bind it to whatever get_session() is. + session.register_new(self) </ins><span class="cx"> if oldinit is not None: </span><span class="cx"> try: </span><span class="cx"> oldinit(self, *args, **kwargs) </span><span class="cx"> except TypeError, msg: </span><span class="cx"> # re-raise with the offending class name added to help in debugging </span><span class="cx"> raise TypeError, '%s.%s' %(self.__class__.__name__, msg) </span><del>- if not nohist: - session.register_new(self) - self.class_.__init__ = init </del><ins>+ # override oldinit, insuring that its not already one of our + # own modified inits + if oldinit is None or not hasattr(oldinit, '_sa_mapper_init'): + init._sa_mapper_init = True + self.class_.__init__ = init </ins><span class="cx"> mapper_registry[self.class_] = self </span><span class="cx"> self.class_.c = self.c </span><span class="cx"> </span><span class="lines">@@ -300,7 +307,23 @@ </span><span class="cx"> mapper.__dict__.update(self.__dict__) </span><span class="cx"> mapper.props = self.props.copy() </span><span class="cx"> return mapper </span><del>- </del><ins>+ + def using(self, session): + """returns a proxying object to this mapper, which will execute methods on the mapper + within the context of the given session. The session is placed as the "current" session + via the push_session/pop_session methods in the objectstore module.""" + mapper = self + class Proxy(object): + def __getattr__(self, key): + def callit(*args, **kwargs): + objectstore.push_session(session) + try: + return getattr(mapper, key)(*args, **kwargs) + finally: + objectstore.pop_session() + return callit + return Proxy() + </ins><span class="cx"> def options(self, *options): </span><span class="cx"> """uses this mapper as a prototype for a new mapper with different behavior. </span><span class="cx"> *options is a list of options directives, which include eagerload(), lazyload(), and noload()""" </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py (1058 => 1059)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-02-27 01:11:56 UTC (rev 1058) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-02-27 02:33:47 UTC (rev 1059) </span><span class="lines">@@ -369,7 +369,8 @@ </span><span class="cx"> self.attributes.commit(obj) </span><span class="cx"> </span><span class="cx"> def register_new(self, obj): </span><del>- self.new.append(obj) </del><ins>+ if not self.new.contains(obj): + self.new.append(obj) </ins><span class="cx"> </span><span class="cx"> def register_dirty(self, obj): </span><span class="cx"> if not self.dirty.contains(obj): </span><span class="lines">@@ -1059,17 +1060,15 @@ </span><span class="cx"> uow = get_session # deprecated </span><span class="cx"> </span><span class="cx"> def push_session(sess): </span><del>- old = _sessions.get(thread.get_ident(), None) </del><ins>+ old = get_session() </ins><span class="cx"> sess._previous = old </span><del>- _sessions[sess.hash_key] = sess - _sessions[thread.get_ident()] = sess </del><ins>+ session_registry.set(sess) </ins><span class="cx"> </span><span class="cx"> def pop_session(): </span><del>- sess = _sessions[thread.get_ident()] </del><ins>+ sess = get_session() </ins><span class="cx"> old = sess._previous </span><span class="cx"> sess._previous = None </span><del>- _sessions[old.hash_key] = old - _sessions[thread.get_ident()] = old </del><ins>+ session_registry.set(old) </ins><span class="cx"> return old </span><span class="cx"> </span><span class="cx"> def using_session(sess, func): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-27 01:12:09
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1058] sqlalchemy/trunk/doc/build/content: doc update for post_update flag</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1058</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-26 19:11:56 -0600 (Sun, 26 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>doc update for post_update flag</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcontentadv_datamappingmyt">sqlalchemy/trunk/doc/build/content/adv_datamapping.myt</a></li> <li><a href="#sqlalchemytrunkdocbuildcontentdocument_basemyt">sqlalchemy/trunk/doc/build/content/document_base.myt</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocbuildcontentadv_datamappingmyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/adv_datamapping.myt (1057 => 1058)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/adv_datamapping.myt 2006-02-27 01:05:01 UTC (rev 1057) +++ sqlalchemy/trunk/doc/build/content/adv_datamapping.myt 2006-02-27 01:11:56 UTC (rev 1058) </span><span class="lines">@@ -127,8 +127,7 @@ </span><span class="cx"> <li>backreference - indicates the name of a property to be placed on the related mapper's class that will handle this relationship in the other direction, including synchronizing the object attributes on both sides of the relation. See the example in <&formatting.myt:link, path="datamapping_relations_backreferences"&>.</li> </span><span class="cx"> <li>order_by - indicates the ordering that should be applied when loading these items. See the section <&formatting.myt:link, path="adv_datamapping_orderby" &> for details.</li> </span><span class="cx"> <li>association - When specifying a many to many relationship with an association object, this keyword should reference the mapper of the target object of the association. See the example in <&formatting.myt:link, path="datamapping_association"&>.</li> </span><del>- <li>use_alias - Useful with eager loads, a value of True indicates that unique alias names should be generated when creating joins against the parent table, to avoid conflicts with parallel joins of the same two tables. The unique aliasing will be propigated into all child eager joins as well to maintain their isolation. This aliasing only occurs when generating SELECT statements, and aliased columns in the result set are translated back to that of the original table when creating object instances.</li> - <li>live=False - this option is no longer used.</li> </del><ins>+ <li>post_update - this indicates that the relationship should be handled by a second UPDATE statement after an INSERT, or before a DELETE. using this flag essentially means the relationship will not incur any "dependency" between parent and child item, as the particular foreign key relationship between them is handled by a second statement. use this flag when a particular mapping arrangement will incur two rows that are dependent on each other, such as a table that has a one-to-many relationship to a set of child rows, and also has a column that references a single child row within that list (i.e. both tables contain a foreign key to each other). If a commit() operation returns an error that a "cyclical dependency" was detected, this is a cue that you might want to use post_update.</li> </ins><span class="cx"> </ul> </span><span class="cx"> </&> </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunkdocbuildcontentdocument_basemyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/document_base.myt (1057 => 1058)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/document_base.myt 2006-02-27 01:05:01 UTC (rev 1057) +++ sqlalchemy/trunk/doc/build/content/document_base.myt 2006-02-27 01:11:56 UTC (rev 1058) </span><span class="lines">@@ -23,7 +23,7 @@ </span><span class="cx"> onepage='documentation' </span><span class="cx"> index='index' </span><span class="cx"> title='SQLAlchemy Documentation' </span><del>- version = '0.1.1' </del><ins>+ version = '0.1.3' </ins><span class="cx"> </%attr> </span><span class="cx"> </span><span class="cx"> <%method title> </span></span></pre> </div> </div> </body> </html> |