代码之家  ›  专栏  ›  技术社区  ›  running.t

是否可以在sqlalchemy中回滚create_all?

  •  4
  • running.t  · 技术社区  · 11 年前

    根据 THIS 对于某些DBMS来说,问题是可以回滚CREATE TABLE语句。 特别是对于sqlite来说,这是可能的(尽管它没有文档)。

    所以我的问题是,有可能在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']
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   Jeff Widman    9 年前
    1. 使用Postgresql或SQL Server。MySQL,Oracle做 支持事务DDL。最近版本的SQLite似乎确实支持事务DDL。Python sqlite3 driver 然而 does not .

    2. 简单配方:

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

      如果在“with:”中引发异常,则事务将回滚。

    3. 想自己看看,好吧:

      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