Transactions 在使用db会话时,如何在sql alchemy中使用事务?
我在我的项目中使用sql炼金术,我使用db会话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
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!