2013-03-26 36 views
3

根据THIS针对某些DBMS的问题,可能会回滚CREATE TABLE语句。 声明它可能为sqlite(尽管它是无证的)。是否可以在sqlalchemy中回滚create_all?

所以我的问题是,是否可以在sqlalchemy中回滚create_all? 我试图写一些测试代码,但它似乎没有工作:

>>> engine = create_engine('sqlite:///:memory:') 
>>> engine 
Engine(sqlite:///:memory:) 
>>> Session = sessionmaker(bind=engine) 
>>> connection = engine.connect() 
>>> session = Session(bind=connection) 
>>> engine.table_names() 
[] 
>>> transaction = connection.begin() 
>>> Base = declarative_base() 
>>> class Test(Base): 
... __tablename__ = 'TEST' 
... id = Column(Integer, primary_key=True) 
... 
>>> Base.metadata.bind = engine 
>>> Base.metadata.create_all() 
>>> engine.table_names() 
[u'TEST'] 
>>> transaction.rollback() 
>>> session.close() 
>>> connection.close() 
>>> engine.table_names() 
[u'TEST'] 

回答

4
  1. 使用PostgreSQL或SQL Server。 MySQL,Oracle做不是支持事务性DDL。最近版本的SQLite似乎支持事务性DDL。 Python sqlite3 driver但是does not

  2. 简单配方:

    with engine.begin() as conn: 
        metadata.create_all(conn) 
    

    ,如果你养内“与”异常,事务将被回滚。

  3. 想看到它自己,OK:

    from sqlalchemy import inspect # need to be running 0.8 for this 
    
    with engine.connect() as conn: 
        trans = conn.begin() 
        metadata.create_all(conn) 
        inspector = inspect(conn) 
        table_names = inspector.get_table_names() 
        trans.rollback() 
        inspector = inspect(conn) 
        rolled_back_table_names = inspector.get_table_names() 
    

获得事务范围的理解,我建议你阅读http://docs.sqlalchemy.org/en/latest/core/connections.html

+0

谢谢您的回答。准确地说,我确实知道你已经提到过的引擎是可能的。正如我正确理解你的答案意味着:这是不可能在SQLAlchemy。 (因为它可以在sqlite客户端回滚创建表 - sqlite3)。那是对的吗? – 2013-03-30 14:30:28

+0

编辑。它是sqlite3驱动程序,它具有上述问题以及其他未解决的问题(http://bugs.python.org/issue9924)有关其处理事务状态的问题。 – zzzeek 2013-03-30 18:17:45

相关问题