在sqlalchemy的同一事务中将数据保存到数据库

时间:2019-06-30 10:45:02

标签: python sqlite sqlalchemy flask-sqlalchemy

我正在为项目使用flask_sqlalchemy

我有两个表OrderDetail定义如下:

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.commitsession.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()

0 个答案:

没有答案