Thread: [SQLObject] Bad side-effect when using sqlhub.doInTransaction()
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Markus G. <m.g...@gm...> - 2007-03-28 19:38:24
|
Hi, the example below demonstrates a bad side-effect of sqlhub.doInTransaction(). I suppose the problem is, that doInTransaction() restores the old connection unconditionally to sqlhub.threadConnection, although self.getConnection() returns sqlhub.processConnection in case it is set. And since doInTransaction() sets sqlhub.threadConnection, changing sqlhub.processConnection afterwards has no effect anymore. Kind regards, Markus Test-script: ---- from sqlobject import * class Person(SQLObject): name = StringCol() def switchDB(uri): sqlhub.processConnection = connectionForURI(uri) def cleanupDB(uri): switchDB(uri) Person.dropTable(ifExists=True) Person.createTable(ifNotExists=True) def test(name): p = Person(name=name) print Person.get(1) print 'OK:' cleanupDB('sqlite:/test1.db3') cleanupDB('sqlite:/test2.db3') switchDB('sqlite:/test1.db3') test('John') switchDB('sqlite:/test2.db3') test('Doe') print 'Bug:' cleanupDB('sqlite:/test1.db3') cleanupDB('sqlite:/test2.db3') switchDB('sqlite:/test1.db3') sqlhub.doInTransaction(test, 'John') switchDB('sqlite:/test2.db3') # has no effect anymore test('Doe') # prints <Person 1 name='John'> from test1.db3 ---- Output: OK: <Person 1 name='John'> <Person 1 name='Doe'> Bug: <Person 1 name='John'> <Person 1 name='John'> |
From: Oleg B. <ph...@ph...> - 2007-03-30 14:42:04
Attachments:
dbconnection.patch
|
Hello! On Wed, Mar 28, 2007 at 09:38:20PM +0200, Markus Gritsch wrote: > the problem is, that > doInTransaction() restores the old connection unconditionally to > sqlhub.threadConnection, although self.getConnection() returns > sqlhub.processConnection in case it is set. And since > doInTransaction() sets sqlhub.threadConnection, changing > sqlhub.processConnection afterwards has no effect anymore. Any opinion on the attached patch? Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Markus G. <m.g...@gm...> - 2007-03-30 14:47:01
|
On 3/30/07, Oleg Broytmann <ph...@ph...> wrote: > Hello! > > On Wed, Mar 28, 2007 at 09:38:20PM +0200, Markus Gritsch wrote: > > the problem is, that > > doInTransaction() restores the old connection unconditionally to > > sqlhub.threadConnection, although self.getConnection() returns > > sqlhub.processConnection in case it is set. And since > > doInTransaction() sets sqlhub.threadConnection, changing > > sqlhub.processConnection afterwards has no effect anymore. > > Any opinion on the attached patch? Looks good so far -- I will try it in the evening. Thanks, Markus |
From: Markus G. <m.g...@gm...> - 2007-03-30 18:28:42
|
On 3/30/07, Oleg Broytmann <ph...@ph...> wrote: > Hello! > > On Wed, Mar 28, 2007 at 09:38:20PM +0200, Markus Gritsch wrote: > > the problem is, that > > doInTransaction() restores the old connection unconditionally to > > sqlhub.threadConnection, although self.getConnection() returns > > sqlhub.processConnection in case it is set. And since > > doInTransaction() sets sqlhub.threadConnection, changing > > sqlhub.processConnection afterwards has no effect anymore. > > Any opinion on the attached patch? Yes, works fine. Thanks again, Markus |