2013-03-26 71 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

相關問題