Transactions 在使用db会话时,如何在sql alchemy中使用事务?

Transactions 在使用db会话时,如何在sql alchemy中使用事务?,transactions,sqlalchemy,Transactions,Sqlalchemy,我在我的项目中使用sql炼金术,我使用db会话 engine = create_engine(configuration) db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) Base = declarative_base

我在我的项目中使用sql炼金术,我使用db会话

engine = create_engine(configuration)
db_session = scoped_session(sessionmaker(autocommit=False,
                                     autoflush=False,
                                     bind=engine))

Base = declarative_base()
Base.query = db_session.query_property()

def init_db():    
    import models
    Base.metadata.create_all(bind=engine)
数据库会话用作:

db_session.merge(order)      #order(model) in object
db_session.commit()
现在我想在order和order line item两个表中插入数据,所以我需要事务, 作为: 1.在第一次插入中,我希望在第二次插入查询中使用插入订单的id 2.若第二次插入查询失败,则应回滚第一次查询

Try:
    #begin transaction/How to begin transaction?
    order=db_session.add(order)      #insert into order
    #is need to commit db_session here as I need inserted orders id
    #here actually db_session.commit() needed to get order's id(auto generated) 
    #if db_session committed here then sql alchemy starts new session       

    order_line_item.id = order.id
    db_session.add(order_line_item)    #insert into order line line item

    db_session.commit()
    #check transaction status if failed then rollback, How to check status?

except:
    db_session.rollback()
如何使用trasaction?

您必须像用户一样


您还可以使用事务。两者都有它的优点,哪一个适合您,您可以使用

嵌套事务,正如Lafada所建议的,并不适用于这种情况。一个
flush()

db_session.begin()
try:
    db_session.add(order)

    db_session.flush()

    order_line_item.id = order.id
    db_session.add(order_line_item)

    db_session.commit()
except:
    db_session.rollback()

或者更好的是,如果您在订单和行项目之间正确设置了关系,您甚至不应该费心手动分配id。

您应该使用SQLAlchemy的
关系
功能,因此您不需要手动分配id
我得摆弄外键。例如,您的订单项目可以
看起来像(我假设你有一个多人的关系):

在插入时,您只需分配订单实例:

order_line_item.order = order
session.add(order)  # you even don't have to insert the item!

请参阅教程中的更多详细信息:

我将在db_session.begin()中使用
:…
,如果可能,请删除
try:。。。除了:…
因为它隐藏了所有异常。
flush
也不是故意的。看看我的答案应该怎么做!
class OrderLineItem(Base):
    id = Column(Integer, primary_key=True)
    order_id = Column(Integer, ForeignKey('orders.id'))
    order = relationship('Order', backref='order_line_items')
order_line_item.order = order
session.add(order)  # you even don't have to insert the item!