我正在为项目使用flask_sqlalchemy。
我有两个表Order
和Detail
定义如下:
Order(id, order_date)
Detail(order_id, product_id, product_quantity, product_price)
order.id
是自动生成的主键,它是detail.order_id
的外键
我想通过以下相同的事务将这些数据保存到数据库
order = Order(order_date='2019-06-30')
detail1 = Detail(order_id=order.id, product_id=100, product_quantity=1, product_price=100)
detail2 = Detail(order_id=order.id, product_id=200, product_quantity=2, product_price=150)
db.session.add(order)
db.session.add(detail1)
db.session.add(detail2)
db.session.commit()
问题在于order.id
在调用db.session.commit
之前似乎无法恢复。所以我需要这样做:
order = Order(order_date='2019-06-30')
db.session.add(order)
db.session.commit()
detail1 = Detail(order_id=order.id, product_id=100, product_quantity=1, product_price=100)
detail2 = Detail(order_id=order.id, product_id=200, product_quantity=2, product_price=150)
db.session.add(detail1)
db.session.add(detail2)
db.session.commit()
如果Detail
数据的保存过程由于某种原因失败,我需要删除之前保存的Order
表的数据。
可以通过任何方式将这些数据保存在同一事务中。
修改
最后,我发现可以使用session.commit
在session.flush
之前获得自动生成的ID。该代码将如下所示:
order = Order(order_date='2019-06-30')
db.session.add(order)
db.session.flush()
detail1 = Detail(order_id=order.id, product_id=100, product_quantity=1, product_price=100)
detail2 = Detail(order_id=order.id, product_id=200, product_quantity=2, product_price=150)
db.session.add(detail1)
db.session.add(detail2)
db.session.commit()