sqlalchemy-commits Mailing List for SQLAlchemy (Page 371)
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-22 15:33:42
|
<!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>[1182] sqlalchemy/trunk/doc/build/content/datamapping.myt: added some references to selectfirst</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1182</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-22 09:33:26 -0600 (Wed, 22 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added some references to selectfirst</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcontentdatamappingmyt">sqlalchemy/trunk/doc/build/content/datamapping.myt</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocbuildcontentdatamappingmyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/datamapping.myt (1181 => 1182)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/datamapping.myt 2006-03-22 01:16:16 UTC (rev 1181) +++ sqlalchemy/trunk/doc/build/content/datamapping.myt 2006-03-22 15:33:26 UTC (rev 1182) </span><span class="lines">@@ -65,7 +65,7 @@ </span><span class="cx"> </span><span class="cx"> userlist = User.mapper.select_by(user_id=12) </span><span class="cx"> </&> </span><del>- <p>There is also a full-blown "monkeypatch" function that creates a primary mapper, attaches the above mapper class property, and also the methods <span class="codeline">get, get_by, select, select_by, selectone, commit</span> and <span class="codeline">delete</span>:</p> </del><ins>+ <p>There is also a full-blown "monkeypatch" function that creates a primary mapper, attaches the above mapper class property, and also the methods <span class="codeline">get, get_by, select, select_by, selectone, selectfirst, commit</span> and <span class="codeline">delete</span>:</p> </ins><span class="cx"> <&|formatting.myt:code&> </span><span class="cx"> assign_mapper(User, users) </span><span class="cx"> userlist = User.select_by(user_id=12) </span><span class="lines">@@ -124,7 +124,7 @@ </span><span class="cx"> result = mapper.select(or_(users.c.user_name == 'john', users.c.user_name=='fred')) </span><span class="cx"> </span><span class="cx"> # using a WHERE criterion to get a scalar </span><del>- u = mapper.selectone(users.c.user_name=='john') </del><ins>+ u = mapper.selectfirst(users.c.user_name=='john') </ins><span class="cx"> </span><span class="cx"> # using a full select object </span><span class="cx"> result = mapper.select(users.select(users.c.user_name=='john')) </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-22 01:16:31
|
<!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>[1181] sqlalchemy/trunk/test: added "nest_on" option for Session, so nested transactions can occur mostly at the Session level, </title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1181</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-21 19:16:16 -0600 (Tue, 21 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added "nest_on" option for Session, so nested transactions can occur mostly at the Session level, fixes [ticket:113]</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.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="#sqlalchemytrunktestobjectstorepy">sqlalchemy/trunk/test/objectstore.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 (1180 => 1181)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-22 00:22:26 UTC (rev 1180) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-22 01:16:16 UTC (rev 1181) </span><span class="lines">@@ -180,6 +180,8 @@ </span><span class="cx"> if parent is not None: </span><span class="cx"> self.__connection = self.engine._pool.unique_connection() </span><span class="cx"> self.__tcount = 0 </span><ins>+ def pop(self): + self.engine.pop_session(self) </ins><span class="cx"> def _connection(self): </span><span class="cx"> try: </span><span class="cx"> return self.__transaction </span><span class="lines">@@ -448,11 +450,13 @@ </span><span class="cx"> sess = SQLSession(self, self.context.session) </span><span class="cx"> self.context.session = sess </span><span class="cx"> return sess </span><del>- def pop_session(self): </del><ins>+ def pop_session(self, s = None): </ins><span class="cx"> """restores the current thread's SQLSession to that before the last push_session. Returns the restored SQLSession object. Raises an exception if there is no SQLSession pushed onto the stack.""" </span><span class="cx"> sess = self.context.session.parent </span><span class="cx"> if sess is None: </span><del>- raise InvalidRequestError("No SQLSession is pushed onto the stack.") </del><ins>+ raise exceptions.InvalidRequestError("No SQLSession is pushed onto the stack.") + elif s is not None and s is not self.context.session: + raise exceptions.InvalidRequestError("Given SQLSession is not the current session on the stack") </ins><span class="cx"> self.context.session = sess </span><span class="cx"> return sess </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1180 => 1181)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-22 00:22:26 UTC (rev 1180) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-22 01:16:16 UTC (rev 1181) </span><span class="lines">@@ -350,6 +350,8 @@ </span><span class="cx"> """returns a proxying object to this mapper, which will execute methods on the mapper </span><span class="cx"> within the context of the given session. The session is placed as the "current" session </span><span class="cx"> via the push_session/pop_session methods in the objectstore module.""" </span><ins>+ if objectstore.get_session() is session: + return self </ins><span class="cx"> mapper = self </span><span class="cx"> class Proxy(object): </span><span class="cx"> def __getattr__(self, key): </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py (1180 => 1181)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-22 00:22:26 UTC (rev 1180) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-22 01:16:16 UTC (rev 1181) </span><span class="lines">@@ -17,7 +17,7 @@ </span><span class="cx"> class Session(object): </span><span class="cx"> """Maintains a UnitOfWork instance, including transaction state.""" </span><span class="cx"> </span><del>- def __init__(self, nest_transactions=False, hash_key=None): </del><ins>+ def __init__(self, nest_on=None, hash_key=None): </ins><span class="cx"> """Initialize the objectstore with a UnitOfWork registry. If called </span><span class="cx"> with no arguments, creates a single UnitOfWork for all operations. </span><span class="cx"> </span><span class="lines">@@ -29,13 +29,28 @@ </span><span class="cx"> self.uow = unitofwork.UnitOfWork() </span><span class="cx"> self.parent_uow = None </span><span class="cx"> self.begin_count = 0 </span><del>- self.nest_transactions = nest_transactions </del><ins>+ self.nest_on = util.to_list(nest_on) + self.__pushed_count = 0 </ins><span class="cx"> if hash_key is None: </span><span class="cx"> self.hash_key = id(self) </span><span class="cx"> else: </span><span class="cx"> self.hash_key = hash_key </span><span class="cx"> _sessions[self.hash_key] = self </span><del>- </del><ins>+ + def was_pushed(self): + if self.nest_on is None: + return + self.__pushed_count += 1 + if self.__pushed_count == 1: + for n in self.nest_on: + n.push_session() + def was_popped(self): + if self.nest_on is None or self.__pushed_count == 0: + return + self.__pushed_count -= 1 + if self.__pushed_count == 0: + for n in self.nest_on: + n.pop_session() </ins><span class="cx"> def get_id_key(ident, class_): </span><span class="cx"> """returns an identity-map key for use in storing/retrieving an item from the identity </span><span class="cx"> map, given a tuple of the object's primary key values. </span><span class="lines">@@ -108,7 +123,7 @@ </span><span class="cx"> def _trans_commit(self, trans): </span><span class="cx"> if trans.uow is self.uow and trans.isactive: </span><span class="cx"> try: </span><del>- self.uow.commit() </del><ins>+ self._commit_uow() </ins><span class="cx"> finally: </span><span class="cx"> self.uow = self.parent_uow </span><span class="cx"> self.parent_uow = None </span><span class="lines">@@ -116,6 +131,13 @@ </span><span class="cx"> if trans.uow is self.uow: </span><span class="cx"> self.uow = self.parent_uow </span><span class="cx"> self.parent_uow = None </span><ins>+ + def _commit_uow(self, *obj): + self.was_pushed() + try: + self.uow.commit(*obj) + finally: + self.was_popped() </ins><span class="cx"> </span><span class="cx"> def commit(self, *objects): </span><span class="cx"> """commits the current UnitOfWork transaction. called with </span><span class="lines">@@ -126,11 +148,12 @@ </span><span class="cx"> # if an object list is given, commit just those but dont </span><span class="cx"> # change begin/commit status </span><span class="cx"> if len(objects): </span><ins>+ self._commit_uow(*objects) </ins><span class="cx"> self.uow.commit(*objects) </span><span class="cx"> return </span><span class="cx"> if self.parent_uow is None: </span><del>- self.uow.commit() - </del><ins>+ self._commit_uow() + </ins><span class="cx"> def refresh(self, *obj): </span><span class="cx"> """reloads the attributes for the given objects from the database, clears </span><span class="cx"> any changes made.""" </span><span class="lines">@@ -287,14 +310,18 @@ </span><span class="cx"> </span><span class="cx"> def push_session(sess): </span><span class="cx"> old = get_session() </span><ins>+ if getattr(sess, '_previous', None) is not None: + raise InvalidRequestError("Given Session is already pushed onto some thread's stack") </ins><span class="cx"> sess._previous = old </span><span class="cx"> session_registry.set(sess) </span><ins>+ sess.was_pushed() </ins><span class="cx"> </span><span class="cx"> def pop_session(): </span><span class="cx"> sess = get_session() </span><span class="cx"> old = sess._previous </span><span class="cx"> sess._previous = None </span><span class="cx"> session_registry.set(old) </span><ins>+ sess.was_popped() </ins><span class="cx"> return old </span><span class="cx"> </span><span class="cx"> def using_session(sess, func): </span></span></pre></div> <a id="sqlalchemytrunktestobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/objectstore.py (1180 => 1181)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/objectstore.py 2006-03-22 00:22:26 UTC (rev 1180) +++ sqlalchemy/trunk/test/objectstore.py 2006-03-22 01:16:16 UTC (rev 1181) </span><span class="lines">@@ -89,7 +89,8 @@ </span><span class="cx"> tables.delete_user_data() </span><span class="cx"> </span><span class="cx"> def test_nested_begin_commit(self): </span><del>- """test nested session.begin/commit""" </del><ins>+ """tests that nesting objectstore transactions with multiple commits + affects only the outermost transaction""" </ins><span class="cx"> class User(object):pass </span><span class="cx"> m = mapper(User, users) </span><span class="cx"> def name_of(id): </span><span class="lines">@@ -117,6 +118,8 @@ </span><span class="cx"> self.assert_(name_of(8) == name2, msg="user_name should be %s" % name2) </span><span class="cx"> </span><span class="cx"> def test_nested_rollback(self): </span><ins>+ """tests that nesting objectstore transactions with a rollback inside + affects only the outermost transaction""" </ins><span class="cx"> class User(object):pass </span><span class="cx"> m = mapper(User, users) </span><span class="cx"> def name_of(id): </span><span class="lines">@@ -141,6 +144,32 @@ </span><span class="cx"> self.assert_(name_of(7) != name1, msg="user_name should not be %s" % name1) </span><span class="cx"> self.assert_(name_of(8) != name2, msg="user_name should not be %s" % name2) </span><span class="cx"> </span><ins>+ def test_true_nested(self): + """tests creating a new Session inside a database transaction, in + conjunction with an engine-level nested transaction, which uses + a second connection in order to achieve a nested transaction that commits, inside + of another engine session that rolls back.""" +# testbase.db.echo='debug' + class User(object): + pass + testbase.db.begin() + try: + m = mapper(User, users) + name1 = "Oliver Twist" + name2 = 'Mr. Bumble' + m.get(7).user_name = name1 + s = objectstore.Session(nest_on=testbase.db) + m.using(s).get(8).user_name = name2 + s.commit() + objectstore.commit() + testbase.db.rollback() + except: + testbase.db.rollback() + raise + objectstore.clear() + self.assert_(m.get(8).user_name == name2) + self.assert_(m.get(7).user_name != name1) + </ins><span class="cx"> class UnicodeTest(AssertMixin): </span><span class="cx"> def setUpAll(self): </span><span class="cx"> global uni_table </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-22 00:22:38
|
<!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>[1180] sqlalchemy/trunk/test/inheritance.py: added unit test to test proper construction of lazy clause against inherited mapper</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1180</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-21 18:22:26 -0600 (Tue, 21 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added unit test to test proper construction of lazy clause against inherited mapper</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunktestinheritancepy">sqlalchemy/trunk/test/inheritance.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunktestinheritancepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/inheritance.py (1179 => 1180)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/inheritance.py 2006-03-21 20:15:44 UTC (rev 1179) +++ sqlalchemy/trunk/test/inheritance.py 2006-03-22 00:22:26 UTC (rev 1180) </span><span class="lines">@@ -384,6 +384,48 @@ </span><span class="cx"> # shouldnt throw exception </span><span class="cx"> products = mapper(Product, product, inherits=contents) </span><span class="cx"> </span><ins>+class InheritTest6(testbase.AssertMixin): + """tests eager load/lazy load of child items off inheritance mappers, tests that + LazyLoader constructs the right query condition.""" + def setUpAll(self): + global foo, bar, bar_foo + foo = Table('foo', testbase.db, Column('id', Integer, Sequence('foo_seq'), primary_key=True), + Column('data', String(30))).create() + bar = Table('bar', testbase.db, Column('id', Integer, ForeignKey('foo.id'), primary_key=True), + Column('data', String(30))).create() </ins><span class="cx"> </span><ins>+ bar_foo = Table('bar_foo', testbase.db, + Column('bar_id', Integer, ForeignKey('bar.id')), + Column('foo_id', Integer, ForeignKey('foo.id')) + ).create() + def tearDownAll(self): + bar_foo.drop() + bar.drop() + foo.drop() + + def testbasic(self): + class Foo(object): pass + class Bar(Foo): pass + + foos = mapper(Foo, foo) + bars = mapper(Bar, bar, inherits=foos) + bars.add_property('lazy', relation(foos, bar_foo, lazy=True)) + bars.add_property('eager', relation(foos, bar_foo, lazy=False)) + + foo.insert().execute(data='foo1') + bar.insert().execute(id=1, data='bar1') + + foo.insert().execute(data='foo2') + bar.insert().execute(id=2, data='bar2') + + foo.insert().execute(data='foo3') #3 + foo.insert().execute(data='foo4') #4 + + bar_foo.insert().execute(bar_id=1, foo_id=3) + bar_foo.insert().execute(bar_id=2, foo_id=4) + + self.assert_(len(bars.selectfirst().lazy) == 1) + self.assert_(len(bars.selectfirst().eager) == 1) + </ins><span class="cx"> if __name__ == "__main__": </span><span class="cx"> testbase.main() </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-21 20:16:01
|
<!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>[1179] sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py: fixed lazy clause construction to go off...you guessed it...the noninherited table !</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1179</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-21 14:15:44 -0600 (Tue, 21 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>fixed lazy clause construction to go off...you guessed it...the noninherited table !</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingpropertiespy">sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemymappingpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py (1178 => 1179)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-21 20:03:45 UTC (rev 1178) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-21 20:15:44 UTC (rev 1179) </span><span class="lines">@@ -563,7 +563,7 @@ </span><span class="cx"> </span><span class="cx"> class LazyLoader(PropertyLoader): </span><span class="cx"> def do_init_subclass(self, key, parent): </span><del>- (self.lazywhere, self.lazybinds) = create_lazy_clause(self.parent.table, self.primaryjoin, self.secondaryjoin, self.foreignkey) </del><ins>+ (self.lazywhere, self.lazybinds) = create_lazy_clause(self.parent.noninherited_table, self.primaryjoin, self.secondaryjoin, self.foreignkey) </ins><span class="cx"> # determine if our "lazywhere" clause is the same as the mapper's </span><span class="cx"> # get() clause. then we can just use mapper.get() </span><span class="cx"> self.use_get = not self.uselist and self.mapper._get_clause.compare(self.lazywhere) </span><span class="lines">@@ -645,6 +645,7 @@ </span><span class="cx"> lazywhere = lazywhere.copy_container() </span><span class="cx"> li = BinaryVisitor(visit_binary) </span><span class="cx"> lazywhere.accept_visitor(li) </span><ins>+ print "OK LAZYWHERE, START WITH TAB", table, "PJ", primaryjoin, "SEC", secondaryjoin, "GOT", lazywhere </ins><span class="cx"> return (lazywhere, binds) </span><span class="cx"> </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-21 20:03: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>[1178] sqlalchemy/trunk/lib/sqlalchemy/sql.py: added "name" back to FromClause</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1178</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-21 14:03:45 -0600 (Tue, 21 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added "name" back to FromClause</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1177 => 1178)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-21 04:38:54 UTC (rev 1177) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-21 20:03:45 UTC (rev 1178) </span><span class="lines">@@ -571,7 +571,7 @@ </span><span class="cx"> class FromClause(Selectable): </span><span class="cx"> """represents an element that can be used within the FROM clause of a SELECT statement.""" </span><span class="cx"> def __init__(self, from_name = None): </span><del>- self.from_name = from_name </del><ins>+ self.from_name = self.name = from_name </ins><span class="cx"> def _get_from_objects(self): </span><span class="cx"> # this could also be [self], at the moment it doesnt matter to the Select object </span><span class="cx"> return [] </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-21 04:39:15
|
<!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>[1177] sqlalchemy/trunk/lib/sqlalchemy: a few changes to attributes.py to allow faster initialization of object attributes on new objects</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1177</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-20 22:38:54 -0600 (Mon, 20 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>a few changes to attributes.py to allow faster initialization of object attributes on new objects</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="#sqlalchemytrunklibsqlalchemymappingpropertiespy">sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.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 (1176 => 1177)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-21 02:43:58 UTC (rev 1176) +++ sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-21 04:38:54 UTC (rev 1177) </span><span class="lines">@@ -72,6 +72,8 @@ </span><span class="cx"> self.key = key </span><span class="cx"> self.orig = PropHistory.NONE </span><span class="cx"> self.extension = extension </span><ins>+ def plain_init(self, *args): + pass </ins><span class="cx"> def gethistory(self, *args, **kwargs): </span><span class="cx"> return self </span><span class="cx"> def clear(self): </span><span class="lines">@@ -152,7 +154,8 @@ </span><span class="cx"> obj.__dict__[key] = [] </span><span class="cx"> </span><span class="cx"> util.HistoryArraySet.__init__(self, list_, readonly=kwargs.get('readonly', False)) </span><del>- </del><ins>+ def plain_init(self, *args): + pass </ins><span class="cx"> def gethistory(self, *args, **kwargs): </span><span class="cx"> return self </span><span class="cx"> def list_value_changed(self, obj, key, item, listval, isdelete): </span><span class="lines">@@ -194,6 +197,14 @@ </span><span class="cx"> self.live = live </span><span class="cx"> self.kwargs = kwargs </span><span class="cx"> </span><ins>+ def plain_init(self, attrhist): + if not self.uselist: + p = PropHistory(self.obj, self.key, **self.kwargs) + self.obj.__dict__[self.key] = None + else: + p = self.manager.create_list(self.obj, self.key, None, readonly=self.live, **self.kwargs) + attrhist[self.key] = p + </ins><span class="cx"> def gethistory(self, passive=False, *args, **kwargs): </span><span class="cx"> if not self.uselist: </span><span class="cx"> if self.obj.__dict__.get(self.key, None) is None: </span><span class="lines">@@ -337,12 +348,21 @@ </span><span class="cx"> self.attribute_history(obj)[key] = p </span><span class="cx"> return p </span><span class="cx"> </span><ins>+ def init_attr(self, obj): + """sets up the _managed_attributes dictionary on an object. this happens anyway regardless + of this method being called, but saves on KeyErrors being thrown in get_history().""" + d = {} + obj.__dict__['_managed_attributes'] = d + cls_managed = self.class_managed(obj.__class__) + for value in cls_managed.values(): + value(obj, d).plain_init(d) + </ins><span class="cx"> def get_history(self, obj, key, passive=False, **kwargs): </span><span class="cx"> """returns the "history" container for the given attribute on the given object. </span><span class="cx"> If the container does not exist, it will be created based on the class-level </span><span class="cx"> history container definition.""" </span><span class="cx"> try: </span><del>- return self.attribute_history(obj)[key].gethistory(passive=passive, **kwargs) </del><ins>+ return obj.__dict__['_managed_attributes'][key].gethistory(passive=passive, **kwargs) </ins><span class="cx"> except KeyError, e: </span><span class="cx"> return self.class_managed(obj.__class__)[key](obj, **kwargs).gethistory(passive=passive, **kwargs) </span><span class="cx"> </span><span class="lines">@@ -351,14 +371,14 @@ </span><span class="cx"> this dictionary is attached to the object via the attribute '_managed_attributes'. </span><span class="cx"> If the dictionary does not exist, it will be created.""" </span><span class="cx"> try: </span><del>- attr = obj.__dict__['_managed_attributes'] </del><ins>+ return obj.__dict__['_managed_attributes'] </ins><span class="cx"> except KeyError: </span><span class="cx"> trigger = obj.__dict__.pop('_managed_trigger', None) </span><span class="cx"> if trigger: </span><span class="cx"> trigger() </span><span class="cx"> attr = {} </span><span class="cx"> obj.__dict__['_managed_attributes'] = attr </span><del>- return attr </del><ins>+ return attr </ins><span class="cx"> </span><span class="cx"> def trigger_history(self, obj, callable): </span><span class="cx"> try: </span><span class="lines">@@ -424,13 +444,15 @@ </span><span class="cx"> the new object instance as an argument to create the new history container. </span><span class="cx"> Extra keyword arguments can be sent which </span><span class="cx"> will be passed along to newly created history containers.""" </span><del>- def createprop(obj): </del><ins>+ def createprop(obj, attrhist=None): </ins><span class="cx"> if callable_ is not None: </span><span class="cx"> func = callable_(obj) </span><span class="cx"> else: </span><span class="cx"> func = None </span><span class="cx"> p = self.create_history_container(obj, key, uselist, callable_=func, **kwargs) </span><del>- self.attribute_history(obj)[key] = p </del><ins>+ if attrhist is None: + attrhist = self.attribute_history(obj) + attrhist[key] = p </ins><span class="cx"> return p </span><span class="cx"> </span><span class="cx"> self.class_managed(class_)[key] = createprop </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1176 => 1177)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-21 02:43:58 UTC (rev 1176) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-21 04:38:54 UTC (rev 1177) </span><span class="lines">@@ -239,6 +239,10 @@ </span><span class="cx"> if not self.class_.__dict__.has_key('_mapper'): </span><span class="cx"> oldinit = self.class_.__init__ </span><span class="cx"> def init(self, *args, **kwargs): </span><ins>+ # this gets the AttributeManager to do some pre-initialization, + # in order to save on KeyErrors later on + objectstore.global_attributes.init_attr(self) + </ins><span class="cx"> nohist = kwargs.pop('_mapper_nohistory', False) </span><span class="cx"> session = kwargs.pop('_sa_session', objectstore.get_session()) </span><span class="cx"> if not nohist: </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py (1176 => 1177)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-21 02:43:58 UTC (rev 1176) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-21 04:38:54 UTC (rev 1177) </span><span class="lines">@@ -714,6 +714,9 @@ </span><span class="cx"> #print "new eagertqarget", p.eagertarget.name, (p.secondary and p.secondary.name or "none"), p.parent.table.name </span><span class="cx"> finally: </span><span class="cx"> del recursion_stack[self.parent.table] </span><ins>+ + self._row_decorator = self._create_decorator_row() + </ins><span class="cx"> self._eager_chained = True </span><span class="cx"> </span><span class="cx"> def _aliasize_orderby(self, orderby, copy=True): </span><span class="lines">@@ -758,7 +761,6 @@ </span><span class="cx"> for key, value in self.mapper.props.iteritems(): </span><span class="cx"> value.setup(key, statement, eagertable=self.eagertarget) </span><span class="cx"> </span><del>- self._decorator_row = self._create_decorator_row() </del><span class="cx"> </span><span class="cx"> def execute(self, instance, row, identitykey, imap, isnew): </span><span class="cx"> """receive a row. tell our mapper to look for a new object instance in the row, and attach </span><span class="lines">@@ -809,7 +811,7 @@ </span><span class="cx"> # (neither do any MapperExtensions). The row is keyed off the Column object </span><span class="cx"> # (which is what mappers use) as well as its "label" (which might be what </span><span class="cx"> # user-defined code is using) </span><del>- row = self._decorator_row(row) </del><ins>+ row = self._row_decorator(row) </ins><span class="cx"> return self.mapper._instance(row, imap, result_list) </span><span class="cx"> </span><span class="cx"> class GenericOption(MapperOption): </span></span></pre> </div> </div> </body> </html> |
<!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>[1176] sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py: a refactoring to the EagerLoaders' _instance method to do a bunch of column arithmetic up front, instead of on each row</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1176</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-20 20:43:58 -0600 (Mon, 20 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>a refactoring to the EagerLoaders' _instance method to do a bunch of column arithmetic up front, instead of on each row</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingpropertiespy">sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemymappingpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py (1175 => 1176)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-20 01:16:16 UTC (rev 1175) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-21 02:43:58 UTC (rev 1176) </span><span class="lines">@@ -758,6 +758,8 @@ </span><span class="cx"> for key, value in self.mapper.props.iteritems(): </span><span class="cx"> value.setup(key, statement, eagertable=self.eagertarget) </span><span class="cx"> </span><ins>+ self._decorator_row = self._create_decorator_row() + </ins><span class="cx"> def execute(self, instance, row, identitykey, imap, isnew): </span><span class="cx"> """receive a row. tell our mapper to look for a new object instance in the row, and attach </span><span class="cx"> it to a list on the parent instance.""" </span><span class="lines">@@ -783,6 +785,21 @@ </span><span class="cx"> </span><span class="cx"> self._instance(row, imap, result_list) </span><span class="cx"> </span><ins>+ def _create_decorator_row(self): + class DecoratorDict(object): + def __init__(self, row): + self.row = row + def __getitem__(self, key): + if map.has_key(key): + key = map[key] + return self.row[key] + map = {} + for c in self.eagertarget.c: + parent = self.target._get_col_by_original(c.original) + map[parent] = c + map[parent._label] = c + return DecoratorDict + </ins><span class="cx"> def _instance(self, row, imap, result_list=None): </span><span class="cx"> """gets an instance from a row, via this EagerLoader's mapper.""" </span><span class="cx"> # since the EagerLoader makes an Alias of its mapper's table, </span><span class="lines">@@ -792,12 +809,7 @@ </span><span class="cx"> # (neither do any MapperExtensions). The row is keyed off the Column object </span><span class="cx"> # (which is what mappers use) as well as its "label" (which might be what </span><span class="cx"> # user-defined code is using) </span><del>- fakerow = util.DictDecorator(row) - for c in self.eagertarget.c: - parent = self.target._get_col_by_original(c.original) - fakerow[parent] = row[c] - fakerow[parent._label] = row[c] - row = fakerow </del><ins>+ row = self._decorator_row(row) </ins><span class="cx"> return self.mapper._instance(row, imap, result_list) </span><span class="cx"> </span><span class="cx"> class GenericOption(MapperOption): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-20 01:16: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>[1175] sqlalchemy/trunk/lib/sqlalchemy: a few tweaks and the polymorph example can also use eager loading</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1175</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-19 19:16:16 -0600 (Sun, 19 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>a few tweaks and the polymorph example can also use eager loading</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkexamplespolymorphpolymorphpy">sqlalchemy/trunk/examples/polymorph/polymorph.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingpropertiespy">sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkexamplespolymorphpolymorphpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/examples/polymorph/polymorph.py (1174 => 1175)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/examples/polymorph/polymorph.py 2006-03-19 21:24:05 UTC (rev 1174) +++ sqlalchemy/trunk/examples/polymorph/polymorph.py 2006-03-20 01:16:16 UTC (rev 1175) </span><span class="lines">@@ -71,8 +71,8 @@ </span><span class="cx"> select( </span><span class="cx"> [people, engineers.c.description, column("'engineer'").label('type')], </span><span class="cx"> people.c.person_id==engineers.c.person_id)).alias('pjoin') </span><ins>+ </ins><span class="cx"> </span><del>- </del><span class="cx"> # lets print out what this Selectable looks like. The mapper is going to take the selectable and </span><span class="cx"> # Select off of it, with the flag "use_labels" which indicates to prefix column names with the table </span><span class="cx"> # name. So here is what our mapper will see: </span><span class="lines">@@ -106,7 +106,7 @@ </span><span class="cx"> # (translation: it'll work) </span><span class="cx"> # TODO: get the eager loading to work (the compound select alias doesnt like being aliased itself) </span><span class="cx"> assign_mapper(Company, companies, properties={ </span><del>- 'employees': relation(people_mapper, private=True) </del><ins>+ 'employees': relation(people_mapper, lazy=False, private=True) </ins><span class="cx"> }) </span><span class="cx"> </span><span class="cx"> c = Company(name='company1') </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py (1174 => 1175)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-19 21:24:05 UTC (rev 1174) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-20 01:16:16 UTC (rev 1175) </span><span class="lines">@@ -785,10 +785,18 @@ </span><span class="cx"> </span><span class="cx"> def _instance(self, row, imap, result_list=None): </span><span class="cx"> """gets an instance from a row, via this EagerLoader's mapper.""" </span><ins>+ # since the EagerLoader makes an Alias of its mapper's table, + # we translate the actual result columns back to what they + # would normally be into a "virtual row" which is passed to the child mapper. + # that way the mapper doesnt have to know about the modified column name + # (neither do any MapperExtensions). The row is keyed off the Column object + # (which is what mappers use) as well as its "label" (which might be what + # user-defined code is using) </ins><span class="cx"> fakerow = util.DictDecorator(row) </span><span class="cx"> for c in self.eagertarget.c: </span><span class="cx"> parent = self.target._get_col_by_original(c.original) </span><span class="cx"> fakerow[parent] = row[c] </span><ins>+ fakerow[parent._label] = row[c] </ins><span class="cx"> row = fakerow </span><span class="cx"> return self.mapper._instance(row, imap, result_list) </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1174 => 1175)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-19 21:24:05 UTC (rev 1174) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-20 01:16:16 UTC (rev 1175) </span><span class="lines">@@ -1040,6 +1040,7 @@ </span><span class="cx"> return BindParamClause(self.table.name + "_" + self.text, obj, shortname = self.text, type=self.type) </span><span class="cx"> def _make_proxy(self, selectable, name = None): </span><span class="cx"> c = ColumnClause(name or self.text, selectable) </span><ins>+ c._original = self.original </ins><span class="cx"> selectable.columns[c.name] = c </span><span class="cx"> return c </span><span class="cx"> def _compare_type(self, obj): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-19 21:24:15
|
<!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>[1174] sqlalchemy/trunk/test/testtypes.py: print remove</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1174</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-19 15:24:05 -0600 (Sun, 19 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>print remove</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunktesttesttypespy">sqlalchemy/trunk/test/testtypes.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunktesttesttypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/testtypes.py (1173 => 1174)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/testtypes.py 2006-03-19 21:23:19 UTC (rev 1173) +++ sqlalchemy/trunk/test/testtypes.py 2006-03-19 21:24:05 UTC (rev 1174) </span><span class="lines">@@ -150,7 +150,6 @@ </span><span class="cx"> binary_table.insert().execute(misc='sql.pyc', data=stream1, data_slice=stream1[0:100]) </span><span class="cx"> binary_table.insert().execute(misc='engine.pyc', data=stream2, data_slice=stream2[0:99]) </span><span class="cx"> l = binary_table.select().execute().fetchall() </span><del>- print 'HI HI HI' </del><span class="cx"> print len(stream1), len(l[0]['data']), len(l[0]['data_slice']) </span><span class="cx"> self.assert_(list(stream1) == list(l[0]['data'])) </span><span class="cx"> self.assert_(list(stream1[0:100]) == list(l[0]['data_slice'])) </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-19 21:23:27
|
<!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>[1173] sqlalchemy/trunk/test/testtypes.py: added size limit on test BLOB since mysql has a configured limit of 65535 (at least on my server....)</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1173</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-19 15:23:19 -0600 (Sun, 19 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added size limit on test BLOB since mysql has a configured limit of 65535 (at least on my server....)</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunktesttesttypespy">sqlalchemy/trunk/test/testtypes.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunktesttesttypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/testtypes.py (1172 => 1173)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/testtypes.py 2006-03-19 21:12:10 UTC (rev 1172) +++ sqlalchemy/trunk/test/testtypes.py 2006-03-19 21:23:19 UTC (rev 1173) </span><span class="lines">@@ -150,6 +150,7 @@ </span><span class="cx"> binary_table.insert().execute(misc='sql.pyc', data=stream1, data_slice=stream1[0:100]) </span><span class="cx"> binary_table.insert().execute(misc='engine.pyc', data=stream2, data_slice=stream2[0:99]) </span><span class="cx"> l = binary_table.select().execute().fetchall() </span><ins>+ print 'HI HI HI' </ins><span class="cx"> print len(stream1), len(l[0]['data']), len(l[0]['data_slice']) </span><span class="cx"> self.assert_(list(stream1) == list(l[0]['data'])) </span><span class="cx"> self.assert_(list(stream1[0:100]) == list(l[0]['data_slice'])) </span><span class="lines">@@ -160,7 +161,8 @@ </span><span class="cx"> mod = getattr(mod, token) </span><span class="cx"> f = mod.__file__ </span><span class="cx"> f = re.sub('\.py$', '\.pyc', f) </span><del>- return file(f).read() </del><ins>+ # put a number less than the typical MySQL default BLOB size + return file(f).read(59473) </ins><span class="cx"> </span><span class="cx"> class DateTest(AssertMixin): </span><span class="cx"> def setUpAll(self): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-19 21:12:24
|
<!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>[1172] sqlalchemy/trunk/examples/polymorph/polymorph.py: got dilbert to be properly modified....</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1172</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-19 15:12:10 -0600 (Sun, 19 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>got dilbert to be properly modified....</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkexamplespolymorphpolymorphpy">sqlalchemy/trunk/examples/polymorph/polymorph.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkexamplespolymorphpolymorphpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/examples/polymorph/polymorph.py (1171 => 1172)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/examples/polymorph/polymorph.py 2006-03-19 16:21:33 UTC (rev 1171) +++ sqlalchemy/trunk/examples/polymorph/polymorph.py 2006-03-19 21:12:10 UTC (rev 1172) </span><span class="lines">@@ -124,7 +124,7 @@ </span><span class="cx"> </span><span class="cx"> print "\n" </span><span class="cx"> </span><del>-dilbert = c.employees[1] </del><ins>+dilbert = Engineer.mapper.get_by(name='dilbert') </ins><span class="cx"> dilbert.description = 'hes dibert!' </span><span class="cx"> objectstore.commit() </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-19 16:21:42
|
<!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>[1171] sqlalchemy/trunk: added distinct() function to column elements for "DISTINCT <col>"</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1171</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-19 10:21:33 -0600 (Sun, 19 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added distinct() function to column elements for "DISTINCT <col>"</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1170 => 1171)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-03-19 05:05:01 UTC (rev 1170) +++ sqlalchemy/trunk/CHANGES 2006-03-19 16:21:33 UTC (rev 1171) </span><span class="lines">@@ -3,6 +3,7 @@ </span><span class="cx"> blown away if it hadnt been loaded </span><span class="cx"> - added unique_connection() method to engine, connection pool to return a connection </span><span class="cx"> that is not part of the thread-local context or any current transaction </span><ins>+- added distinct() function to column elements so you can do func.count(mycol.distinct()) </ins><span class="cx"> </span><span class="cx"> 0.1.4 </span><span class="cx"> - create_engine() now uses genericized parameters; host/hostname, db/dbname/database, </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1170 => 1171)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-19 05:05:01 UTC (rev 1170) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-19 16:21:33 UTC (rev 1171) </span><span class="lines">@@ -490,6 +490,8 @@ </span><span class="cx"> return self._compare('LIKE', "%" + str(other)) </span><span class="cx"> def label(self, name): </span><span class="cx"> return Label(name, self) </span><ins>+ def distinct(self): + return CompoundClause(None,"DISTNCT", self) </ins><span class="cx"> def op(self, operator): </span><span class="cx"> return lambda other: self._compare(operator, other) </span><span class="cx"> # and here come the math operators: </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-19 05:05:17
|
<!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>[1170] sqlalchemy/trunk/lib/sqlalchemy: got rid of from "ids", using the From object itself as identity now.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1170</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-18 23:05:01 -0600 (Sat, 18 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>got rid of from "ids", using the From object itself as identity now. improves correlation logic and fixes [ticket:116]</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesoraclepy">sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py (1169 => 1170)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-03-19 04:20:06 UTC (rev 1169) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-03-19 05:05:01 UTC (rev 1170) </span><span class="lines">@@ -283,7 +283,7 @@ </span><span class="cx"> orderby = self.strings[select.order_by_clause] </span><span class="cx"> else: </span><span class="cx"> # TODO: try to get "oid_column" to be used here </span><del>- orderby = "%s.rowid ASC" % select.froms[0].id </del><ins>+ orderby = "%s.rowid ASC" % select.froms[0].name </ins><span class="cx"> select.append_column(sql.ColumnClause("ROW_NUMBER() OVER (ORDER BY %s)" % orderby).label("ora_rn")) </span><span class="cx"> limitselect = sql.select([c for c in select.c if c.key!='ora_rn']) </span><span class="cx"> if select.offset is not None: </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1169 => 1170)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-19 04:20:06 UTC (rev 1169) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-19 05:05:01 UTC (rev 1170) </span><span class="lines">@@ -355,9 +355,9 @@ </span><span class="cx"> FROM objects in the dictionary corresponding to this ClauseElement, </span><span class="cx"> and possibly removes or modifies others.""" </span><span class="cx"> for f in self._get_from_objects(): </span><del>- data.setdefault(f.id, f) </del><ins>+ data.setdefault(f, f) </ins><span class="cx"> if asfrom: </span><del>- data[self.id] = self </del><ins>+ data[self] = self </ins><span class="cx"> def compare(self, other): </span><span class="cx"> """compares this ClauseElement to the given ClauseElement. </span><span class="cx"> </span><span class="lines">@@ -568,9 +568,8 @@ </span><span class="cx"> </span><span class="cx"> class FromClause(Selectable): </span><span class="cx"> """represents an element that can be used within the FROM clause of a SELECT statement.""" </span><del>- def __init__(self, from_name = None, from_key = None): </del><ins>+ def __init__(self, from_name = None): </ins><span class="cx"> self.from_name = from_name </span><del>- self.id = from_key or from_name </del><span class="cx"> def _get_from_objects(self): </span><span class="cx"> # this could also be [self], at the moment it doesnt matter to the Select object </span><span class="cx"> return [] </span><span class="lines">@@ -602,7 +601,7 @@ </span><span class="cx"> if not raiseerr: </span><span class="cx"> return None </span><span class="cx"> else: </span><del>- raise InvalidRequestError("cant get orig for " + str(column) + " with table " + column.table.id + " from table " + self.id) </del><ins>+ raise InvalidRequestError("cant get orig for " + str(column) + " with table " + column.table.name + " from table " + self.name) </ins><span class="cx"> </span><span class="cx"> def _get_exported_attribute(self, name): </span><span class="cx"> try: </span><span class="lines">@@ -682,7 +681,6 @@ </span><span class="cx"> def __init__(self, text = "", engine=None, bindparams=None, typemap=None): </span><span class="cx"> self.parens = False </span><span class="cx"> self._engine = engine </span><del>- self.id = id(self) </del><span class="cx"> self.bindparams = {} </span><span class="cx"> self.typemap = typemap </span><span class="cx"> if typemap is not None: </span><span class="lines">@@ -881,7 +879,6 @@ </span><span class="cx"> def __init__(self, left, right, onclause=None, isouter = False): </span><span class="cx"> self.left = left </span><span class="cx"> self.right = right </span><del>- self.id = self.left.id + "_" + self.right.id </del><span class="cx"> </span><span class="cx"> # TODO: if no onclause, do NATURAL JOIN </span><span class="cx"> if onclause is None: </span><span class="lines">@@ -932,8 +929,8 @@ </span><span class="cx"> engine = property(lambda s:s.left.engine or s.right.engine) </span><span class="cx"> </span><span class="cx"> class JoinMarker(FromClause): </span><del>- def __init__(self, id, join): - FromClause.__init__(self, from_key=id) </del><ins>+ def __init__(self, join): + FromClause.__init__(self) </ins><span class="cx"> self.join = join </span><span class="cx"> def _exportable_columns(self): </span><span class="cx"> return [] </span><span class="lines">@@ -943,12 +940,12 @@ </span><span class="cx"> return self.select(use_labels=True, correlate=False).alias(name) </span><span class="cx"> def _process_from_dict(self, data, asfrom): </span><span class="cx"> for f in self.onclause._get_from_objects(): </span><del>- data[f.id] = f </del><ins>+ data[f] = f </ins><span class="cx"> for f in self.left._get_from_objects() + self.right._get_from_objects(): </span><span class="cx"> # mark the object as a "blank" "from" that wont be printed </span><del>- data[f.id] = Join.JoinMarker(f.id, self) </del><ins>+ data[f] = Join.JoinMarker(self) </ins><span class="cx"> # a JOIN always impacts the final FROM list of a select statement </span><del>- data[self.id] = self </del><ins>+ data[self] = self </ins><span class="cx"> </span><span class="cx"> def _get_from_objects(self): </span><span class="cx"> return [self] + self.onclause._get_from_objects() + self.left._get_from_objects() + self.right._get_from_objects() </span><span class="lines">@@ -968,7 +965,6 @@ </span><span class="cx"> n = n[0:15] </span><span class="cx"> alias = n + "_" + hex(random.randint(0, 65535))[2:] </span><span class="cx"> self.name = alias </span><del>- self.id = self.name </del><span class="cx"> if self.selectable.oid_column is not None: </span><span class="cx"> self.oid_column = self.selectable.oid_column._make_proxy(self) </span><span class="cx"> else: </span><span class="lines">@@ -1052,7 +1048,7 @@ </span><span class="cx"> class TableClause(FromClause): </span><span class="cx"> def __init__(self, name, *columns): </span><span class="cx"> super(TableClause, self).__init__(name) </span><del>- self.name = self.id = self.fullname = name </del><ins>+ self.name = self.fullname = name </ins><span class="cx"> self._columns = util.OrderedProperties() </span><span class="cx"> self._indexes = util.OrderedProperties() </span><span class="cx"> self._foreign_keys = [] </span><span class="lines">@@ -1110,9 +1106,9 @@ </span><span class="cx"> return False </span><span class="cx"> def _process_from_dict(self, data, asfrom): </span><span class="cx"> for f in self._get_from_objects(): </span><del>- data.setdefault(f.id, f) </del><ins>+ data.setdefault(f, f) </ins><span class="cx"> if asfrom: </span><del>- data[self.id] = self </del><ins>+ data[self] = self </ins><span class="cx"> def count(self, whereclause=None, **params): </span><span class="cx"> return select([func.count(1).label('count')], whereclause, from_obj=[self], **params) </span><span class="cx"> def join(self, right, *args, **kwargs): </span><span class="lines">@@ -1170,7 +1166,6 @@ </span><span class="cx"> </span><span class="cx"> class CompoundSelect(SelectBaseMixin, FromClause): </span><span class="cx"> def __init__(self, keyword, *selects, **kwargs): </span><del>- self.id = "Compound(%d)" % id(self) </del><span class="cx"> self.keyword = keyword </span><span class="cx"> self.selects = selects </span><span class="cx"> self.use_labels = kwargs.pop('use_labels', False) </span><span class="lines">@@ -1214,7 +1209,6 @@ </span><span class="cx"> def __init__(self, columns=None, whereclause = None, from_obj = [], order_by = None, group_by=None, having=None, use_labels = False, distinct=False, engine = None, limit=None, offset=None, scalar=False, correlate=True): </span><span class="cx"> self._froms = util.OrderedDict() </span><span class="cx"> self.use_labels = use_labels </span><del>- self.id = "Select(%d)" % id(self) </del><span class="cx"> self.name = None </span><span class="cx"> self.whereclause = None </span><span class="cx"> self.having = None </span><span class="lines">@@ -1323,8 +1317,8 @@ </span><span class="cx"> </span><span class="cx"> _hash_recursion = util.RecursionStack() </span><span class="cx"> </span><del>- def clear_from(self, id): - self.append_from(FromClause(from_name = None, from_key = id)) </del><ins>+ def clear_from(self, from_obj): + self._froms[from_obj] = FromClause(from_name = None) </ins><span class="cx"> </span><span class="cx"> def append_from(self, fromclause): </span><span class="cx"> if type(fromclause) == str: </span><span class="lines">@@ -1335,7 +1329,7 @@ </span><span class="cx"> fromclause._process_from_dict(self._froms, True) </span><span class="cx"> </span><span class="cx"> def _get_froms(self): </span><del>- return [f for f in self._froms.values() if f is not self and (self._correlated is None or not self._correlated.has_key(f.id))] </del><ins>+ return [f for f in self._froms.values() if f is not self and (self._correlated is None or not self._correlated.has_key(f))] </ins><span class="cx"> froms = property(lambda s: s._get_froms()) </span><span class="cx"> </span><span class="cx"> def accept_visitor(self, visitor): </span><span class="lines">@@ -1400,7 +1394,7 @@ </span><span class="cx"> for key in parameters.keys(): </span><span class="cx"> value = parameters[key] </span><span class="cx"> if isinstance(value, Select): </span><del>- value.clear_from(self.table.id) </del><ins>+ value.clear_from(self.table) </ins><span class="cx"> elif _is_literal(value): </span><span class="cx"> if _is_literal(key): </span><span class="cx"> col = self.table.c[key] </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-19 04:20: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>[1169] sqlalchemy/trunk/test: got clause elements inside INSERTs going...</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1169</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-18 22:20:06 -0600 (Sat, 18 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>got clause elements inside INSERTs going...</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyansisqlpy">sqlalchemy/trunk/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemytrunktestselectpy">sqlalchemy/trunk/test/select.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ansisql.py (1168 => 1169)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-03-18 00:33:50 UTC (rev 1168) +++ sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-03-19 04:20:06 UTC (rev 1169) </span><span class="lines">@@ -452,13 +452,21 @@ </span><span class="cx"> </span><span class="cx"> self.isinsert = True </span><span class="cx"> colparams = self._get_colparams(insert_stmt) </span><del>- for c in colparams: - b = c[1] - self.binds[b.key] = b - self.binds[b.shortname] = b - </del><ins>+ + def create_param(p): + if isinstance(p, sql.BindParamClause): + self.binds[p.key] = p + self.binds[p.shortname] = p + return self.bindparam_string(p.key) + else: + p.accept_visitor(self) + if isinstance(p, sql.ClauseElement) and not isinstance(p, sql.ColumnElement): + return "(" + self.get_str(p) + ")" + else: + return self.get_str(p) + </ins><span class="cx"> text = ("INSERT INTO " + insert_stmt.table.fullname + " (" + string.join([c[0].name for c in colparams], ', ') + ")" + </span><del>- " VALUES (" + string.join([self.bindparam_string(c[1].key) for c in colparams], ', ') + ")") </del><ins>+ " VALUES (" + string.join([create_param(c[1]) for c in colparams], ', ') + ")") </ins><span class="cx"> </span><span class="cx"> self.strings[insert_stmt] = text </span><span class="cx"> </span><span class="lines">@@ -482,7 +490,7 @@ </span><span class="cx"> return self.bindparam_string(p.key) </span><span class="cx"> else: </span><span class="cx"> p.accept_visitor(self) </span><del>- if isinstance(p, sql.ClauseElement) and not isinstance(p, sql.ColumnClause): </del><ins>+ if isinstance(p, sql.ClauseElement) and not isinstance(p, sql.ColumnElement): </ins><span class="cx"> return "(" + self.get_str(p) + ")" </span><span class="cx"> else: </span><span class="cx"> return self.get_str(p) </span></span></pre></div> <a id="sqlalchemytrunktestselectpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/select.py (1168 => 1169)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/select.py 2006-03-18 00:33:50 UTC (rev 1168) +++ sqlalchemy/trunk/test/select.py 2006-03-19 04:20:06 UTC (rev 1169) </span><span class="lines">@@ -57,7 +57,6 @@ </span><span class="cx"> </span><span class="cx"> class SQLTest(PersistTest): </span><span class="cx"> def runtest(self, clause, result, engine = None, params = None, checkparams = None): </span><del>- print "TEST with e", engine </del><span class="cx"> c = clause.compile(parameters=params, engine=engine) </span><span class="cx"> self.echo("\nSQL String:\n" + str(c) + repr(c.get_params())) </span><span class="cx"> cc = re.sub(r'\n', '', str(c)) </span><span class="lines">@@ -523,6 +522,9 @@ </span><span class="cx"> "INSERT INTO mytable (myid, name, description) VALUES (:myid, :name, :description)", </span><span class="cx"> checkparams = {'myid':3, 'name':'jack', 'description':'mydescription'} </span><span class="cx"> ) </span><ins>+ + def testinsertexpression(self): + self.runtest(insert(table1), "INSERT INTO mytable (myid) VALUES (lala())", params=dict(myid=func.lala())) </ins><span class="cx"> </span><span class="cx"> def testupdate(self): </span><span class="cx"> self.runtest(update(table1, table1.c.myid == 7), "UPDATE mytable SET name=:name WHERE mytable.myid = :mytable_myid", params = {table1.c.name:'fred'}) </span><span class="lines">@@ -543,7 +545,7 @@ </span><span class="cx"> values = { </span><span class="cx"> table1.c.name : table1.c.name + "lala", </span><span class="cx"> table1.c.myid : func.do_stuff(table1.c.myid, literal('hoho')) </span><del>- }), "UPDATE mytable SET myid=(do_stuff(mytable.myid, :literal_2)), name=(mytable.name + :mytable_name) WHERE mytable.myid = hoho(:hoho) AND mytable.name = :literal + mytable.name + :literal_1") </del><ins>+ }), "UPDATE mytable SET myid=do_stuff(mytable.myid, :literal_2), name=mytable.name + :mytable_name WHERE mytable.myid = hoho(:hoho) AND mytable.name = :literal + mytable.name + :literal_1") </ins><span class="cx"> </span><span class="cx"> def testcorrelatedupdate(self): </span><span class="cx"> # test against a straight text subquery </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-18 00:33: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>[1168] sqlalchemy/trunk/lib/sqlalchemy/sql.py: der + engine...</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1168</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 18:33:50 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>der + engine...</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1167 => 1168)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-18 00:32:49 UTC (rev 1167) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-18 00:33:50 UTC (rev 1168) </span><span class="lines">@@ -813,7 +813,7 @@ </span><span class="cx"> data.setdefault(self, self) </span><span class="cx"> def copy_container(self): </span><span class="cx"> clauses = [clause.copy_container() for clause in self.clauses] </span><del>- return Function(self.name, type=self.type, packagenames=self.packagenames, *clauses) </del><ins>+ return Function(self.name, type=self.type, packagenames=self.packagenames, engine=self._engine, *clauses) </ins><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> for c in self.clauses: </span><span class="cx"> c.accept_visitor(visitor) </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-18 00:33:02
|
<!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>[1167] sqlalchemy/trunk/lib/sqlalchemy: got oracle parenthesized rules for funcs back, fixed copy_container on function</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1167</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 18:32:49 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>got oracle parenthesized rules for funcs back, fixed copy_container on function</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyansisqlpy">sqlalchemy/trunk/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesoraclepy">sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ansisql.py (1166 => 1167)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-03-18 00:12:59 UTC (rev 1166) +++ sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-03-18 00:32:49 UTC (rev 1167) </span><span class="lines">@@ -220,10 +220,13 @@ </span><span class="cx"> else: </span><span class="cx"> self.strings[list] = string.join([self.get_str(c) for c in list.clauses], ', ') </span><span class="cx"> </span><ins>+ def apply_function_parens(self, func): + return func.name.upper() not in ANSI_FUNCS or len(func.clauses) > 0 + </ins><span class="cx"> def visit_function(self, func): </span><span class="cx"> if len(self.select_stack): </span><span class="cx"> self.typemap.setdefault(func.name, func.type) </span><del>- if func.name.upper() in ANSI_FUNCS and not len(func.clauses): </del><ins>+ if not self.apply_function_parens(func): </ins><span class="cx"> self.strings[func] = ".".join(func.packagenames + [func.name]) </span><span class="cx"> else: </span><span class="cx"> self.strings[func] = ".".join(func.packagenames + [func.name]) + "(" + string.join([self.get_str(c) for c in func.clauses], ', ') + ")" </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py (1166 => 1167)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-03-18 00:12:59 UTC (rev 1166) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-03-18 00:32:49 UTC (rev 1167) </span><span class="lines">@@ -221,6 +221,9 @@ </span><span class="cx"> gives Oracle a chance to tack on a "FROM DUAL" to the string output. """ </span><span class="cx"> return " FROM DUAL" </span><span class="cx"> </span><ins>+ def apply_function_parens(self, func): + return len(func.clauses) > 0 + </ins><span class="cx"> def visit_join(self, join): </span><span class="cx"> if self._use_ansi: </span><span class="cx"> return ansisql.ANSICompiler.visit_join(self, join) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1166 => 1167)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-18 00:12:59 UTC (rev 1166) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-18 00:32:49 UTC (rev 1167) </span><span class="lines">@@ -794,7 +794,7 @@ </span><span class="cx"> def __init__(self, name, *clauses, **kwargs): </span><span class="cx"> self.name = name </span><span class="cx"> self.type = kwargs.get('type', sqltypes.NULLTYPE) </span><del>- self.packagenames = kwargs.get('packagenames') </del><ins>+ self.packagenames = kwargs.get('packagenames', None) or [] </ins><span class="cx"> self._engine = kwargs.get('engine', None) </span><span class="cx"> if self._engine is not None: </span><span class="cx"> self.type = self._engine.type_descriptor(self.type) </span><span class="lines">@@ -813,7 +813,7 @@ </span><span class="cx"> data.setdefault(self, self) </span><span class="cx"> def copy_container(self): </span><span class="cx"> clauses = [clause.copy_container() for clause in self.clauses] </span><del>- return Function(self.name, type=self.type, *clauses) </del><ins>+ return Function(self.name, type=self.type, packagenames=self.packagenames, *clauses) </ins><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> for c in self.clauses: </span><span class="cx"> c.accept_visitor(visitor) </span></span></pre> </div> </div> </body> </html> |
<!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>[1166] sqlalchemy/trunk/test: PropertyLoader will not re-determine direction when initialized a second time, as it is re-initialized as a copy made for an inheriting mapper, and no longer can get to the correct inheriting table.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1166</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 18:12:59 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>PropertyLoader will not re-determine direction when initialized a second time, as it is re-initialized as a copy made for an inheriting mapper, and no longer can get to the correct inheriting table.</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingpropertiespy">sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py</a></li> <li><a href="#sqlalchemytrunktestinheritancepy">sqlalchemy/trunk/test/inheritance.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemymappingpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py (1165 => 1166)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-17 23:56:54 UTC (rev 1165) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-18 00:12:59 UTC (rev 1166) </span><span class="lines">@@ -118,6 +118,7 @@ </span><span class="cx"> self.primaryjoin = primaryjoin </span><span class="cx"> self.secondaryjoin = secondaryjoin </span><span class="cx"> self.post_update = post_update </span><ins>+ self.direction = None </ins><span class="cx"> </span><span class="cx"> # would like to have foreignkey be a list. </span><span class="cx"> # however, have to figure out how to do </span><span class="lines">@@ -186,7 +187,10 @@ </span><span class="cx"> # but its possible that its reversed </span><span class="cx"> self._find_dependent() </span><span class="cx"> </span><del>- self.direction = self._get_direction() </del><ins>+ # if we are re-initializing, as in a copy made for an inheriting + # mapper, dont re-evaluate the direction. + if self.direction is None: + self.direction = self._get_direction() </ins><span class="cx"> </span><span class="cx"> if self.uselist is None and self.direction == PropertyLoader.MANYTOONE: </span><span class="cx"> self.uselist = False </span></span></pre></div> <a id="sqlalchemytrunktestinheritancepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/inheritance.py (1165 => 1166)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/inheritance.py 2006-03-17 23:56:54 UTC (rev 1165) +++ sqlalchemy/trunk/test/inheritance.py 2006-03-18 00:12:59 UTC (rev 1166) </span><span class="lines">@@ -351,5 +351,39 @@ </span><span class="cx"> self.assert_(compare == result) </span><span class="cx"> self.assert_(l[0].parent_foo.data == 'foo #1' and l[1].parent_foo.data == 'foo #1') </span><span class="cx"> </span><ins>+class InheritTest5(testbase.AssertMixin): + def setUpAll(self): + engine = testbase.db + global content_type, content, product + content_type = Table('content_type', engine, + Column('id', Integer, primary_key=True) + ) + content = Table('content', engine, + Column('id', Integer, primary_key=True), + Column('content_type_id', Integer, ForeignKey('content_type.id')) + ) + product = Table('product', engine, + Column('id', Integer, ForeignKey('content.id'), primary_key=True) + ) + def tearDownAll(self): + testbase.db.tables.clear() + + def tearDown(self): + pass + + def testbasic(self): + class ContentType(object): pass + class Content(object): pass + class Product(object): pass + + content_types = mapper(ContentType, content_type) + contents = mapper(Content, content, properties={ + 'content_type':relation(content_types) + }) + #contents.add_property('content_type', relation(content_types)) #adding this makes the inheritance stop working + # shouldnt throw exception + products = mapper(Product, product, inherits=contents) + + </ins><span class="cx"> if __name__ == "__main__": </span><span class="cx"> testbase.main() </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-17 23:57: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>[1165] sqlalchemy/trunk/lib/sqlalchemy/engine.py: rolled back the operationalerror catch...definitely doesnt work right now</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1165</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 17:56:54 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>rolled back the operationalerror catch...definitely doesnt work right now</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 (1164 => 1165)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-17 22:00:24 UTC (rev 1164) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-17 23:56:54 UTC (rev 1165) </span><span class="lines">@@ -701,9 +701,6 @@ </span><span class="cx"> parameters = {} </span><span class="cx"> try: </span><span class="cx"> c.execute(statement, parameters) </span><del>- except self.dbapi().OperationalError, e: - c.parent.invalidate() - raise exceptions.SQLError(statement, parameters, e) </del><span class="cx"> except Exception, e: </span><span class="cx"> raise exceptions.SQLError(statement, parameters, e) </span><span class="cx"> self.context.rowcount = c.rowcount </span></span></pre> </div> </div> </body> </html> |
<!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>[1164] sqlalchemy/trunk/lib/sqlalchemy/engine.py: put a try/finally to insure that SQLSession is cleaned out on rollback/commit regardless of issues</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1164</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 16:00:24 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>put a try/finally to insure that SQLSession is cleaned out on rollback/commit regardless of issues</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 (1163 => 1164)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-17 21:58:00 UTC (rev 1163) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-17 22:00:24 UTC (rev 1164) </span><span class="lines">@@ -199,15 +199,19 @@ </span><span class="cx"> def rollback(self): </span><span class="cx"> """rolls back the transaction on this SQLSession's connection. this can be called regardless of the "begin" counter value, i.e. can be called from anywhere inside a callstack. the "begin" counter is cleared.""" </span><span class="cx"> if self.__tcount > 0: </span><del>- self.engine.do_rollback(self.connection) - del self.__transaction - self.__tcount = 0 </del><ins>+ try: + self.engine.do_rollback(self.connection) + finally: + del self.__transaction + self.__tcount = 0 </ins><span class="cx"> def commit(self): </span><span class="cx"> """commits the transaction started by begin(). If begin() was called multiple times, a counter will be decreased for each call to commit(), with the actual commit operation occuring when the counter reaches zero. this is to provide "nested" behavior of transactions so that different functions in a particular call stack can call begin()/commit() independently of each other without knowledge of an existing transaction.""" </span><span class="cx"> if self.__tcount == 1: </span><del>- self.engine.do_commit(self.connection) - del self.__transaction - self.__tcount = 0 </del><ins>+ try: + self.engine.do_commit(self.connection) + finally: + del self.__transaction + self.__tcount = 0 </ins><span class="cx"> elif self.__tcount > 1: </span><span class="cx"> self.__tcount -= 1 </span><span class="cx"> def is_begun(self): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-17 21:58:11
|
<!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>[1163] sqlalchemy/trunk/lib/sqlalchemy: overhaul to SQLSession change from yesterday, needs to use the threadlocal capability of the pool after all</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1163</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 15:58:00 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>overhaul to SQLSession change from yesterday, needs to use the threadlocal capability of the pool after all</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemypoolpy">sqlalchemy/trunk/lib/sqlalchemy/pool.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 (1162 => 1163)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-17 21:22:30 UTC (rev 1162) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-17 21:58:00 UTC (rev 1163) </span><span class="lines">@@ -171,33 +171,42 @@ </span><span class="cx"> return default.arg </span><span class="cx"> </span><span class="cx"> class SQLSession(object): </span><del>- """represents a particular connection retrieved from a SQLEngine, and associated transactional state.""" </del><ins>+ """represents a a handle to the SQLEngine's connection pool. the default SQLSession maintains a distinct connection during transactions, otherwise returns connections newly retrieved from the pool each time. the Pool is usually configured to have use_threadlocal=True so if a particular connection is already checked out, youll get that same connection in the same thread. There can also be a "unique" SQLSession pushed onto the engine, which returns a connection via the unique_connection() method on Pool; this allows nested transactions to take place, or other operations upon more than one connection at a time.`""" </ins><span class="cx"> def __init__(self, engine, parent=None): </span><span class="cx"> self.engine = engine </span><span class="cx"> self.parent = parent </span><ins>+ # if we have a parent SQLSession, then use a unique connection. + # else we use the default connection returned by the pool. + if parent is not None: + self.__connection = self.engine._pool.unique_connection() </ins><span class="cx"> self.__tcount = 0 </span><span class="cx"> def _connection(self): </span><span class="cx"> try: </span><del>- return self.__connection </del><ins>+ return self.__transaction </ins><span class="cx"> except AttributeError: </span><del>- self.__connection = self.engine._pool.connect() - return self.__connection </del><ins>+ try: + return self.__connection + except AttributeError: + return self.engine._pool.connect() </ins><span class="cx"> connection = property(_connection, doc="the connection represented by this SQLSession. The connection is late-connecting, meaning the call to the connection pool only occurs when it is first called (and the pool will typically only connect the first time it is called as well)") </span><span class="cx"> </span><span class="cx"> def begin(self): </span><span class="cx"> """begins" a transaction on this SQLSession's connection. repeated calls to begin() will increment a counter that must be decreased by corresponding commit() statements before an actual commit occurs. this is to provide "nested" behavior of transactions so that different functions in a particular call stack can call begin()/commit() independently of each other without knowledge of an existing transaction.""" </span><span class="cx"> if self.__tcount == 0: </span><ins>+ self.__transaction = self.connection </ins><span class="cx"> self.engine.do_begin(self.connection) </span><span class="cx"> self.__tcount += 1 </span><span class="cx"> def rollback(self): </span><span class="cx"> """rolls back the transaction on this SQLSession's connection. this can be called regardless of the "begin" counter value, i.e. can be called from anywhere inside a callstack. the "begin" counter is cleared.""" </span><span class="cx"> if self.__tcount > 0: </span><span class="cx"> self.engine.do_rollback(self.connection) </span><ins>+ del self.__transaction </ins><span class="cx"> self.__tcount = 0 </span><span class="cx"> def commit(self): </span><span class="cx"> """commits the transaction started by begin(). If begin() was called multiple times, a counter will be decreased for each call to commit(), with the actual commit operation occuring when the counter reaches zero. this is to provide "nested" behavior of transactions so that different functions in a particular call stack can call begin()/commit() independently of each other without knowledge of an existing transaction.""" </span><span class="cx"> if self.__tcount == 1: </span><span class="cx"> self.engine.do_commit(self.connection) </span><ins>+ del self.__transaction </ins><span class="cx"> self.__tcount = 0 </span><span class="cx"> elif self.__tcount > 1: </span><span class="cx"> self.__tcount -= 1 </span><span class="lines">@@ -223,7 +232,7 @@ </span><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><del>- params['use_threadlocal'] = False </del><ins>+ params['use_threadlocal'] = True </ins><span class="cx"> self._pool = sqlalchemy.pool.manage(self.dbapi(), **params).get_pool(*cargs, **cparams) </span><span class="cx"> else: </span><span class="cx"> self._pool = pool </span><span class="lines">@@ -417,9 +426,11 @@ </span><span class="cx"> def do_rollback(self, connection): </span><span class="cx"> """implementations might want to put logic here for turning autocommit on/off, </span><span class="cx"> etc.""" </span><ins>+ #print "ENGINE ROLLBACK ON ", connection.connection </ins><span class="cx"> connection.rollback() </span><span class="cx"> def do_commit(self, connection): </span><span class="cx"> """implementations might want to put logic here for turning autocommit on/off, etc.""" </span><ins>+ #print "ENGINE COMMIT ON ", connection.connection </ins><span class="cx"> connection.commit() </span><span class="cx"> </span><span class="cx"> def _session(self): </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemypoolpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/pool.py (1162 => 1163)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/pool.py 2006-03-17 21:22:30 UTC (rev 1162) +++ sqlalchemy/trunk/lib/sqlalchemy/pool.py 2006-03-17 21:58:00 UTC (rev 1163) </span><span class="lines">@@ -196,7 +196,7 @@ </span><span class="cx"> </span><span class="cx"> def do_return_conn(self, conn): </span><span class="cx"> if self._echo: </span><del>- self.log("return connection to pool") </del><ins>+ self.log("return QP connection to pool") </ins><span class="cx"> try: </span><span class="cx"> self._pool.put(conn, False) </span><span class="cx"> except Queue.Full: </span><span class="lines">@@ -210,7 +210,7 @@ </span><span class="cx"> </span><span class="cx"> def do_get(self): </span><span class="cx"> if self._echo: </span><del>- self.log("get connection from pool") </del><ins>+ self.log("get QP connection from pool") </ins><span class="cx"> self.log(self.status()) </span><span class="cx"> try: </span><span class="cx"> return self._pool.get(self._max_overflow > -1 and self._overflow >= self._max_overflow) </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-17 21:22:39
|
<!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>[1162] sqlalchemy/trunk/lib/sqlalchemy/engine.py: attempting to catch OperationalErrors and invalidate the connection</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1162</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 15:22:30 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>attempting to catch OperationalErrors and invalidate the connection</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 (1161 => 1162)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-17 21:14:39 UTC (rev 1161) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-17 21:22:30 UTC (rev 1162) </span><span class="lines">@@ -686,6 +686,9 @@ </span><span class="cx"> parameters = {} </span><span class="cx"> try: </span><span class="cx"> c.execute(statement, parameters) </span><ins>+ except self.dbapi().OperationalError, e: + c.parent.invalidate() + raise exceptions.SQLError(statement, parameters, e) </ins><span class="cx"> except Exception, e: </span><span class="cx"> raise exceptions.SQLError(statement, parameters, e) </span><span class="cx"> self.context.rowcount = c.rowcount </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-17 21:14:48
|
<!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>[1161] sqlalchemy/trunk/lib/sqlalchemy/pool.py: added invalidate() method to connectionfairy, allows the connection to be removed from pooling</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1161</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 15:14:39 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added invalidate() method to connectionfairy, allows the connection to be removed from pooling</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemypoolpy">sqlalchemy/trunk/lib/sqlalchemy/pool.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemypoolpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/pool.py (1160 => 1161)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/pool.py 2006-03-17 21:11:59 UTC (rev 1160) +++ sqlalchemy/trunk/lib/sqlalchemy/pool.py 2006-03-17 21:14:39 UTC (rev 1161) </span><span class="lines">@@ -134,6 +134,9 @@ </span><span class="cx"> self.connection = None </span><span class="cx"> self.pool.return_invalid() </span><span class="cx"> raise </span><ins>+ def invalidate(self): + self.connection = None + self.pool.return_invalid() </ins><span class="cx"> def cursor(self): </span><span class="cx"> return CursorFairy(self, self.connection.cursor()) </span><span class="cx"> def __getattr__(self, key): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-17 21:12:17
|
<!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>[1160] sqlalchemy/trunk/test: identified more issues with inheritance.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1160</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 15:11:59 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>identified more issues with inheritance. mapper inheritance is more closed-minded about how it creates the join crit erion as well as the sync rules in inheritance. syncrules have been tightened up to be smarter about creating a new SyncRule given lists of tables and a join clause. properties also checks for relation direction against the "noninherited table" which for the moment makes it a stronger requirement that a relation to a mapper must relate to that mapper's main table, not any tables that it inherits from.</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingpropertiespy">sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingsyncpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/sync.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyutilpy">sqlalchemy/trunk/lib/sqlalchemy/util.py</a></li> <li><a href="#sqlalchemytrunktestinheritancepy">sqlalchemy/trunk/test/inheritance.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 (1159 => 1160)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-17 20:22:55 UTC (rev 1159) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-17 21:11:59 UTC (rev 1160) </span><span class="lines">@@ -63,10 +63,23 @@ </span><span class="cx"> </span><span class="cx"> if inherits is not None: </span><span class="cx"> self.primarytable = inherits.primarytable </span><del>- # inherit_condition is optional since the join can figure it out </del><ins>+ # inherit_condition is optional. + if inherit_condition is None: + # figure out inherit condition from our table to the immediate table + # of the inherited mapper, not its full table which could pull in other + # stuff we dont want (allows test/inheritance.InheritTest4 to pass) + inherit_condition = sql.join(inherits.noninherited_table, table).onclause </ins><span class="cx"> self.table = sql.join(inherits.table, table, inherit_condition) </span><ins>+ #print "inherit condition", str(self.table.onclause) + + # generate sync rules. similarly to creating the on clause, specify a + # stricter set of tables to create "sync rules" by,based on the immediate + # inherited table, rather than all inherited tables </ins><span class="cx"> self._synchronizer = sync.ClauseSynchronizer(self, self, sync.ONETOMANY) </span><del>- self._synchronizer.compile(self.table.onclause, inherits.tables, TableFinder(table)) </del><ins>+ self._synchronizer.compile(self.table.onclause, util.HashSet([inherits.noninherited_table]), TableFinder(table)) + # the old rule + #self._synchronizer.compile(self.table.onclause, inherits.tables, TableFinder(table)) + </ins><span class="cx"> self.inherits = inherits </span><span class="cx"> self.noninherited_table = table </span><span class="cx"> else: </span><span class="lines">@@ -965,7 +978,8 @@ </span><span class="cx"> def __init__(self, table, check_columns=False): </span><span class="cx"> self.tables = [] </span><span class="cx"> self.check_columns = check_columns </span><del>- table.accept_visitor(self) </del><ins>+ if table is not None: + table.accept_visitor(self) </ins><span class="cx"> def visit_table(self, table): </span><span class="cx"> self.tables.append(table) </span><span class="cx"> def __len__(self): </span><span class="lines">@@ -977,7 +991,7 @@ </span><span class="cx"> def __contains__(self, obj): </span><span class="cx"> return obj in self.tables </span><span class="cx"> def __add__(self, obj): </span><del>- return self.tables + obj </del><ins>+ return self.tables + list(obj) </ins><span class="cx"> def visit_column(self, column): </span><span class="cx"> if self.check_columns: </span><span class="cx"> column.table.accept_visitor(self) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py (1159 => 1160)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-17 20:22:55 UTC (rev 1159) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-03-17 21:11:59 UTC (rev 1160) </span><span class="lines">@@ -228,11 +228,9 @@ </span><span class="cx"> return PropertyLoader.ONETOMANY </span><span class="cx"> elif self.secondaryjoin is not None: </span><span class="cx"> return PropertyLoader.MANYTOMANY </span><del>- elif self.foreigntable == self.target: - #elif self.foreigntable is self.target or self.foreigntable in self.mapper.tables: </del><ins>+ elif self.foreigntable == self.mapper.noninherited_table: </ins><span class="cx"> return PropertyLoader.ONETOMANY </span><del>- elif self.foreigntable == self.parent.table: - #elif self.foreigntable is self.parent.table or self.foreigntable in self.parent.tables: </del><ins>+ elif self.foreigntable == self.parent.noninherited_table: </ins><span class="cx"> return PropertyLoader.MANYTOONE </span><span class="cx"> else: </span><span class="cx"> raise ArgumentError("Cant determine relation direction") </span><span class="lines">@@ -529,6 +527,7 @@ </span><span class="cx"> The list of rules is used within commits by the _synchronize() method when dependent </span><span class="cx"> objects are processed.""" </span><span class="cx"> </span><ins>+ </ins><span class="cx"> parent_tables = util.HashSet(self.parent.tables + [self.parent.primarytable]) </span><span class="cx"> target_tables = util.HashSet(self.mapper.tables + [self.mapper.primarytable]) </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingsyncpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/sync.py (1159 => 1160)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/sync.py 2006-03-17 20:22:55 UTC (rev 1159) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/sync.py 2006-03-17 21:11:59 UTC (rev 1160) </span><span class="lines">@@ -24,13 +24,15 @@ </span><span class="cx"> self.syncrules = [] </span><span class="cx"> </span><span class="cx"> def compile(self, sqlclause, source_tables, target_tables, issecondary=None): </span><del>- def check_for_table(binary, l): - for col in [binary.left, binary.right]: - if col.table in l: - return col </del><ins>+ def check_for_table(binary, list1, list2): + #print "check for table", str(binary), [str(c) for c in l] + if binary.left.table in list1 and binary.right.table in list2: + return (binary.left, binary.right) + elif binary.right.table in list1 and binary.left.table in list2: + return (binary.right, binary.left) </ins><span class="cx"> else: </span><del>- return None - </del><ins>+ return (None, None) + </ins><span class="cx"> def compile_binary(binary): </span><span class="cx"> """assembles a SyncRule given a single binary condition""" </span><span class="cx"> if binary.operator != '=' or not isinstance(binary.left, schema.Column) or not isinstance(binary.right, schema.Column): </span><span class="lines">@@ -53,8 +55,7 @@ </span><span class="cx"> else: </span><span class="cx"> raise AssertionError("assert failed") </span><span class="cx"> else: </span><del>- pt = check_for_table(binary, source_tables) - tt = check_for_table(binary, target_tables) </del><ins>+ (pt, tt) = check_for_table(binary, source_tables, target_tables) </ins><span class="cx"> #print "OK", binary, [t.name for t in source_tables], [t.name for t in target_tables] </span><span class="cx"> if pt and tt: </span><span class="cx"> if self.direction == ONETOMANY: </span><span class="lines">@@ -94,7 +95,7 @@ </span><span class="cx"> self.issecondary = issecondary </span><span class="cx"> self.dest_mapper = dest_mapper </span><span class="cx"> self.dest_column = dest_column </span><del>- #print "SyncRule", source_mapper, source_column, dest_column, dest_mapper, direction </del><ins>+ #print "SyncRule", source_mapper, source_column, dest_column, dest_mapper </ins><span class="cx"> </span><span class="cx"> def execute(self, source, dest, obj, child, clearkeys): </span><span class="cx"> if source is None: </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyutilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/util.py (1159 => 1160)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-03-17 20:22:55 UTC (rev 1159) +++ sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-03-17 21:11:59 UTC (rev 1160) </span><span class="lines">@@ -255,6 +255,8 @@ </span><span class="cx"> return self.map.has_key(item) </span><span class="cx"> def clear(self): </span><span class="cx"> self.map.clear() </span><ins>+ def intersection(self, l): + return HashSet([x for x in l if self.contains(x)]) </ins><span class="cx"> def empty(self): </span><span class="cx"> return len(self.map) == 0 </span><span class="cx"> def append(self, item): </span></span></pre></div> <a id="sqlalchemytrunktestinheritancepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/inheritance.py (1159 => 1160)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/inheritance.py 2006-03-17 20:22:55 UTC (rev 1159) +++ sqlalchemy/trunk/test/inheritance.py 2006-03-17 21:11:59 UTC (rev 1160) </span><span class="lines">@@ -14,80 +14,83 @@ </span><span class="cx"> pass </span><span class="cx"> </span><span class="cx"> class InheritTest(testbase.AssertMixin): </span><del>- def setUpAll(self): - global principals - global users - global groups - global user_group_map - principals = Table( - 'principals', - testbase.db, - Column('principal_id', Integer, Sequence('principal_id_seq', optional=False), primary_key=True), - Column('name', String(50), nullable=False), - ) </del><ins>+ """deals with inheritance and many-to-many relationships""" + def setUpAll(self): + global principals + global users + global groups + global user_group_map + principals = Table( + 'principals', + testbase.db, + Column('principal_id', Integer, Sequence('principal_id_seq', optional=False), primary_key=True), + Column('name', String(50), nullable=False), + ) </ins><span class="cx"> </span><del>- users = Table( - 'prin_users', - testbase.db, - Column('principal_id', Integer, ForeignKey('principals.principal_id'), primary_key=True), - Column('password', String(50), nullable=False), - Column('email', String(50), nullable=False), - Column('login_id', String(50), nullable=False), </del><ins>+ users = Table( + 'prin_users', + testbase.db, + Column('principal_id', Integer, ForeignKey('principals.principal_id'), primary_key=True), + Column('password', String(50), nullable=False), + Column('email', String(50), nullable=False), + Column('login_id', String(50), nullable=False), </ins><span class="cx"> </span><del>- ) </del><ins>+ ) </ins><span class="cx"> </span><del>- groups = Table( - 'prin_groups', - testbase.db, - Column( 'principal_id', Integer, ForeignKey('principals.principal_id'), primary_key=True), </del><ins>+ groups = Table( + 'prin_groups', + testbase.db, + Column( 'principal_id', Integer, ForeignKey('principals.principal_id'), primary_key=True), </ins><span class="cx"> </span><del>- ) </del><ins>+ ) </ins><span class="cx"> </span><del>- user_group_map = Table( - 'prin_user_group_map', - testbase.db, - Column('user_id', Integer, ForeignKey( "prin_users.principal_id"), primary_key=True ), - Column('group_id', Integer, ForeignKey( "prin_groups.principal_id"), primary_key=True ), - #Column('user_id', Integer, ForeignKey( "prin_users.principal_id"), ), - #Column('group_id', Integer, ForeignKey( "prin_groups.principal_id"), ), </del><ins>+ user_group_map = Table( + 'prin_user_group_map', + testbase.db, + Column('user_id', Integer, ForeignKey( "prin_users.principal_id"), primary_key=True ), + Column('group_id', Integer, ForeignKey( "prin_groups.principal_id"), primary_key=True ), + #Column('user_id', Integer, ForeignKey( "prin_users.principal_id"), ), + #Column('group_id', Integer, ForeignKey( "prin_groups.principal_id"), ), </ins><span class="cx"> </span><del>- ) </del><ins>+ ) </ins><span class="cx"> </span><del>- principals.create() - users.create() - groups.create() - user_group_map.create() - def tearDownAll(self): - user_group_map.drop() - groups.drop() - users.drop() - principals.drop() - testbase.db.tables.clear() - def setUp(self): - objectstore.clear() - clear_mappers() - - def testbasic(self): - assign_mapper( Principal, principals ) - assign_mapper( - User, - users, - inherits=Principal.mapper - ) </del><ins>+ principals.create() + users.create() + groups.create() + user_group_map.create() + def tearDownAll(self): + user_group_map.drop() + groups.drop() + users.drop() + principals.drop() + testbase.db.tables.clear() + def setUp(self): + objectstore.clear() + clear_mappers() + + def testbasic(self): + assign_mapper( Principal, principals ) + assign_mapper( + User, + users, + inherits=Principal.mapper + ) </ins><span class="cx"> </span><del>- assign_mapper( - Group, - groups, - inherits=Principal.mapper, - properties=dict( users = relation(User.mapper, user_group_map, lazy=True, backref="groups") ) - ) </del><ins>+ assign_mapper( + Group, + groups, + inherits=Principal.mapper, + properties=dict( users = relation(User.mapper, user_group_map, lazy=True, backref="groups") ) + ) </ins><span class="cx"> </span><del>- g = Group(name="group1") - g.users.append(User(name="user1", password="pw", email="fo...@ba...", login_id="lg1")) - - objectstore.commit() - </del><ins>+ g = Group(name="group1") + g.users.append(User(name="user1", password="pw", email="fo...@ba...", login_id="lg1")) + + objectstore.commit() + # TODO: put an assertion + </ins><span class="cx"> class InheritTest2(testbase.AssertMixin): </span><ins>+ """deals with inheritance and many-to-many relationships""" </ins><span class="cx"> def setUpAll(self): </span><span class="cx"> engine = testbase.db </span><span class="cx"> global foo, bar, foo_bar </span><span class="lines">@@ -155,6 +158,7 @@ </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> class InheritTest3(testbase.AssertMixin): </span><ins>+ """deals with inheritance and many-to-many relationships""" </ins><span class="cx"> def setUpAll(self): </span><span class="cx"> engine = testbase.db </span><span class="cx"> global foo, bar, blub, bar_foo, blub_bar, blub_foo,tables </span><span class="lines">@@ -217,9 +221,11 @@ </span><span class="cx"> b.foos.append(Foo("foo #1")) </span><span class="cx"> b.foos.append(Foo("foo #2")) </span><span class="cx"> objectstore.commit() </span><ins>+ compare = repr(b) + repr(b.foos) </ins><span class="cx"> objectstore.clear() </span><span class="cx"> l = Bar.mapper.select() </span><del>- print l[0], l[0].foos </del><ins>+ self.echo(repr(l[0]) + repr(l[0].foos)) + self.assert_(repr(l[0]) + repr(l[0].foos) == compare) </ins><span class="cx"> </span><span class="cx"> def testadvanced(self): </span><span class="cx"> class Foo(object): </span><span class="lines">@@ -274,7 +280,76 @@ </span><span class="cx"> self.echo(x) </span><span class="cx"> self.assert_(repr(x) == compare) </span><span class="cx"> </span><ins>+class InheritTest4(testbase.AssertMixin): + """deals with inheritance and one-to-many relationships""" + def setUpAll(self): + engine = testbase.db + global foo, bar, blub, tables + engine.engine.echo = 'debug' + # the 'data' columns are to appease SQLite which cant handle a blank INSERT + foo = Table('foo', engine, + Column('id', Integer, Sequence('foo_seq'), primary_key=True), + Column('data', String(20))) </ins><span class="cx"> </span><ins>+ bar = Table('bar', engine, + Column('id', Integer, ForeignKey('foo.id'), primary_key=True), + Column('data', String(20))) </ins><span class="cx"> </span><ins>+ blub = Table('blub', engine, + Column('id', Integer, ForeignKey('bar.id'), primary_key=True), + Column('foo_id', Integer, ForeignKey('foo.id'), nullable=False), + Column('data', String(20))) + + tables = [foo, bar, blub] + for table in tables: + table.create() + def tearDownAll(self): + for table in reversed(tables): + table.drop() + testbase.db.tables.clear() + + def tearDown(self): + for table in reversed(tables): + table.delete().execute() + + def testbasic(self): + class Foo(object): + def __init__(self, data=None): + self.data = data + def __repr__(self): + return "Foo id %d, data %s" % (self.id, self.data) + Foo.mapper = mapper(Foo, foo) + + class Bar(Foo): + def __repr__(self): + return "Bar id %d, data %s" % (self.id, self.data) + + Bar.mapper = mapper(Bar, bar, inherits=Foo.mapper) + + class Blub(Bar): + def __repr__(self): + return "Blub id %d, data %s" % (self.id, self.data) + + Blub.mapper = mapper(Blub, blub, inherits=Bar.mapper, properties={ + # bug was raised specifically based on the order of cols in the join.... +# 'parent_foo':relation(Foo.mapper, primaryjoin=blub.c.foo_id==foo.c.id) +# 'parent_foo':relation(Foo.mapper, primaryjoin=foo.c.id==blub.c.foo_id) + 'parent_foo':relation(Foo.mapper) + }) + + b1 = Blub("blub #1") + b2 = Blub("blub #2") + f = Foo("foo #1") + b1.parent_foo = f + b2.parent_foo = f + objectstore.commit() + compare = repr(b1) + repr(b2) + repr(b1.parent_foo) + repr(b2.parent_foo) + objectstore.clear() + l = Blub.mapper.select() + result = repr(l[0]) + repr(l[1]) + repr(l[0].parent_foo) + repr(l[1].parent_foo) + self.echo(result) + self.assert_(compare == result) + self.assert_(l[0].parent_foo.data == 'foo #1' and l[1].parent_foo.data == 'foo #1') + </ins><span class="cx"> if __name__ == "__main__": </span><span class="cx"> testbase.main() </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-17 20:23: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>[1159] sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py: an import ! eesh</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1159</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 14:22:55 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>an import ! eesh</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingobjectstorepy">sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemymappingobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py (1158 => 1159)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-17 17:47:23 UTC (rev 1158) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-17 20:22:55 UTC (rev 1159) </span><span class="lines">@@ -12,7 +12,7 @@ </span><span class="cx"> from sqlalchemy.exceptions import * </span><span class="cx"> import unitofwork </span><span class="cx"> import weakref </span><del>- </del><ins>+import sqlalchemy </ins><span class="cx"> </span><span class="cx"> class Session(object): </span><span class="cx"> """Maintains a UnitOfWork instance, including transaction state.""" </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-03-17 17:47:37
|
<!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>[1158] sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py: removed old function generation override, ANSI functions handled by the core now</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1158</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-17 11:47:23 -0600 (Fri, 17 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>removed old function generation override, ANSI functions handled by the core now</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesoraclepy">sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py (1157 => 1158)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-03-17 06:20:24 UTC (rev 1157) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-03-17 17:47:23 UTC (rev 1158) </span><span class="lines">@@ -253,12 +253,6 @@ </span><span class="cx"> else: </span><span class="cx"> self.strings[column] = "%s.%s" % (column.table.name, column.name) </span><span class="cx"> </span><del>- def visit_function(self, func): - if len(func.clauses): - super(OracleCompiler, self).visit_function(func) - else: - self.strings[func] = func.name - </del><span class="cx"> def visit_insert(self, insert): </span><span class="cx"> """inserts are required to have the primary keys be explicitly present. </span><span class="cx"> mapper will by default not put them in the insert statement to comply </span></span></pre> </div> </div> </body> </html> |