On Jun 24, 1:23 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: > On Jun 24, 2010, at 12:35 PM, Torsten Landschoff wrote: > > That's what I thought but it does not cure my problem. > > e.raw_connect().isolation_levelis in fact None, but the rollback is not > > done anyway. :-( > > its passing it through.....dont know what else we can do there
I ran into this myself today and after struggling for a few hours I came across this thread. I then ended up creating a test case to reproduce the problem and it suggests the problem stems from some behaviour of transactions or of the engine.base.Connection class. I don't quite know what to make of it yet, but I think it shows that the effect of "passing it through" is being counteracted by something else. I ran this on Python 2.6.5 with SA 0.6.3 on Windows. '''Test showing unexpected behaviour with sqlalchemy and sqlite3 and isolation_level settings. The test creates one table outside of a transaction (to detect potential problems with the test not executing properly) then creates a second table inside a transaction which it immediately rolls back. test01() fails basically as expected, since the sqlite3 DBAPI layer appears to need isolation_level==None to properly roll back DDL statements. test02() succeeds because isolation_level==None now. This test and test01() both use a connection from engine.raw_connection(), which is a sqlalchemy.pool._ConnectionFairy() object. test03() tries again with isolation_level==None but using a transaction created from a connection returned by engine.connect(), which is a sqlalchemy.engine.base.Connection() object. This test fails in spite of the isolation_level setting. ''' import unittest from sqlalchemy import create_engine DBPATH = 'sqlite://' DDL = 'create table %s (id integer primary key)' class TestCase(unittest.TestCase): def setup(self, **kwargs): self.engine = create_engine(DBPATH, **kwargs) self.engine.execute(DDL % 'foo') def rollback_raw(self): conn = self.engine.raw_connection() try: conn.execute('begin') conn.execute(DDL % 'bar') raise ValueError except ValueError: conn.rollback() def rollback_txn(self): conn = self.engine.connect() try: txn = conn.begin() conn.execute(DDL % 'bar') raise ValueError except ValueError: txn.rollback() def get_table_names(self): conn = self.engine.raw_connection() return [x[0] for x in conn.execute('select name from sqlite_master')] def test01(self): '''use engine with default isolation_level''' self.setup() self.rollback_raw() self.assertEqual(['foo'], self.get_table_names()) def test02(self): '''use raw_connection with isolation_level None''' self.setup(connect_args={'isolation_level': None}) self.rollback_raw() self.assertEqual(['foo'], self.get_table_names()) def test03(self): '''use transaction with isolation_level None''' self.setup(connect_args={'isolation_level': None}) self.rollback_txn() self.assertEqual(['foo'], self.get_table_names()) if __name__ == '__main__': unittest.main() -- Peter Hansen Engenuity Corporation -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.