sqlite doesn't include CREATE TABLE statements within the scope of a  
transaction.  I think that's a relatively rare behavior only seen in  
Postgres, in fact - I dont think Oracle or MySQL have that behavior,  
for example.

On Feb 5, 2009, at 10:01 PM, Chris Miles wrote:

>
> That did the trick, thanks.
>
> Well, actually, it did the trick for PostgreSQL but sqlite isn't
> rolling back.  The SA logs show the same commands are being sent to
> both.  Here's an example:
>
> $ rm test1.sqlite
> $ python sa_create_table_transaction_test.py
> 2009-02-06 13:39:29,006 INFO sqlalchemy.engine.base.Engine.0x..d0
> BEGIN
> 2009-02-06 13:39:29,007 INFO sqlalchemy.engine.base.Engine.0x..d0
> CREATE TABLE table1 (
>        col1 INTEGER
> )
>
>
> 2009-02-06 13:39:29,007 INFO sqlalchemy.engine.base.Engine.0x..d0 {}
> 2009-02-06 13:39:29,021 INFO sqlalchemy.engine.base.Engine.0x..d0
> CREATE TABLE table2 (
>        col1 INTEGER
> )
>
>
> 2009-02-06 13:39:29,021 INFO sqlalchemy.engine.base.Engine.0x..d0 {}
> 2009-02-06 13:39:29,024 INFO sqlalchemy.engine.base.Engine.0x..d0
> CREATE TABLE table2 (
>        col1 INTEGER
> )
>
>
> 2009-02-06 13:39:29,024 INFO sqlalchemy.engine.base.Engine.0x..d0 {}
> 2009-02-06 13:39:29,027 INFO sqlalchemy.engine.base.Engine.0x..d0
> ROLLBACK
> $ sqlite3 test1.sqlite
> Loading resources from /Users/chris/.sqliterc
> SQLite version 3.4.0
> Enter ".help" for instructions
> sqlite> .tables
> table1  table2
> sqlite>
>
>
> And the updated test script:
>
> # ----
> import sqlalchemy as sa
>
> engine = sa.create_engine('sqlite:///test1.sqlite')
> #engine = sa.create_engine('postgres://localhost/test1')
> engine.echo = True
> metadata = sa.MetaData()
>
> table1 = sa.Table("table1", metadata,
>    sa.Column('col1', sa.types.Integer,),
> )
> table2 = sa.Table("table2", metadata,
>    sa.Column('col1', sa.types.Integer,),
> )
> table3 = sa.Table("table3", metadata,
>    sa.Column('col1', sa.types.Integer,),
> )
>
> metadata.bind = engine
> connection = engine.connect()
> trans = connection.begin()
> try:
>    table1.create(bind=connection)
>    table2.create(bind=connection)
>    table2.create(bind=connection)
>    table3.create(bind=connection)
>    trans.commit()
> except:
>    trans.rollback()
> # ----
>
> Cheers,
> Chris
>
>
> On Feb 6, 2:08 am, Michael Bayer <mike...@zzzcomputing.com> wrote:
>> create() and create_all() take a "bind" argument which can be an
>> engine or connection.  you want the connection in this case.
>>
>> On Feb 5, 2009, at 5:27 AM, Chris Miles wrote:
>>> I can't find away to link table.create() with the existing
>>> transaction.
>
> >


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@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
-~----------~----~----~----~------~----~------~--~---

Reply via email to