首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在SQLAlchemy ORM中插入提取的对象

无法在SQLAlchemy ORM中插入提取的对象
EN

Stack Overflow用户
提问于 2021-10-21 08:19:16
回答 1查看 47关注 0票数 1

我正在尝试插入/更新使用SQLAlchemy对象模型提取的对象列表。

代码语言:javascript
复制
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模式。)

EN

回答 1

Stack Overflow用户

发布于 2021-10-23 09:12:44

问题是这些对象在detached state中,这意味着bulk_save_objects会尝试update rather than insert它们*。

通过在每个对象上调用orm.make_transient,可以将状态重置为瞬态,然后可以通过bulk_save_objects保存它们。

代码语言:javascript
复制
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_objectsupdate_changed_only参数为True,由于对象的属性历史记录中没有任何更改,因此不会尝试任何更新。将其设置为False将发出UPDATE语句,但会产生StaleDataError,因为UPDATE与空表中的任何行都不匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69658337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档