我在我的项目中使用sql alchemy,我使用db session,
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)
数据库 session 用作:
db_session.merge(order) #order(model) in object
db_session.commit()
现在我想将数据插入到订单和订单行项目两个表中,所以我需要事务, 作为: 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()
如何使用交易?
最佳答案
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。
关于transactions - 如何在使用数据库 session 的同时使用sql alchemy中的事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10063328/