我正在尝试插入/更新使用SQLAlchemy对象模型提取的对象列表。
def truncate_mytable(self):
with self.session.begin():
current_records = self.session.query(MyTable).all()
self.session.query(MyTable).delete()
self.session.expunge_all()
return current_records
def compensate_truncate_mytable(self, objects):
with self.session.begin():
self.session.bulk_save_objects(objects)但是,虽然对象已被正确提取,但它们并未写入数据库。
会不会是因为对象内部还有一些受保护的属性,比如<sqlalchemy.orm.state.InstanceState object at 0x11471bf70>和<ClassManager of <class 'lib.kaizen_models.models.MyTable'> at 1146673b0>?列表中的对象类型为<lib.kaizen_models.models.MyTable object at 0x11471bd00>。
(我正在编写补偿方法,遵循Saga模式。)
发布于 2021-10-23 09:12:44
问题是这些对象在detached state中,这意味着bulk_save_objects会尝试update rather than insert它们*。
通过在每个对象上调用orm.make_transient,可以将状态重置为瞬态,然后可以通过bulk_save_objects保存它们。
def truncate_mytable(self):
with self.session.begin():
current_records = self.session.query(MyTable).all()
self.session.query(MyTable).delete()
self.session.expunge_all()
for record in current records:
orm.make_transient(record)
return current_records或者,您可以在调用bulk_save_objects之前将对象merge回到会话中,但这可能会降低您希望从批量操作中获得的性能优势。
*默认情况下,bulk_create_objects的update_changed_only参数为True,由于对象的属性历史记录中没有任何更改,因此不会尝试任何更新。将其设置为False将发出UPDATE语句,但会产生StaleDataError,因为UPDATE与空表中的任何行都不匹配。
https://stackoverflow.com/questions/69658337
复制相似问题