gpt4 book ai didi

python - 分配给子关系时避免在冲洗后选择

转载 作者:太空狗 更新时间:2023-10-30 00:12:56 25 4
gpt4 key购买 nike

我有以下 SQLAlchemy 模型:

class Parent(Base):
id = Column(Integer, primary_key=True)

class Child(Base):
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
parent_id = Column(Integer, ForeignKey(Parent.id), nullable=False)

parent = relationship(Parent,
backref=backref('children',
order_by=id,
cascade='all, delete-orphan'))

然后我想在同一个语句中创建一个父项和一些子项:

p = Parent()
DBSession.add(p)

# some unrelated code runs which triggers a flush

p.children = [Child(title=title) for title in titles]

那个 p.children = 赋值语句触发了不需要的 SELECT 语句,因为 SQLAlchemy 必须清除任何预先存在的 Child 对象指向到 Parent。我意识到我可以使用 backref 上的 lazy='noload' 选项消除 SELECT 语句,但我需要这种关系才能正常运行(即从数据库中获取结果) 在其他情况下。

有没有一种方法可以使属性返回 noload 关系的值(如果已设置),否则使用常规关系从数据库加载结果?或者我什至是在以正确的方式思考这个问题?

最佳答案

Sam 在评论中指出了正确的答案,DBSession.no_autoflush:

with DBSession.no_autoflush:
p = Parent()
DBSession.add(p)

# some unrelated code runs which triggers a flush

p.children = [Child(title=title) for title in titles]

这在分配给 p.children 时消除了不需要的 SELECT 语句。

关于python - 分配给子关系时避免在冲洗后选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47167637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com