gpt4 book ai didi

python - SQLAlchemy - 设置关系时更新外键

转载 作者:太空狗 更新时间:2023-10-29 20:20:26 26 4
gpt4 key购买 nike

我有一个类:

class ExampleClass(Base):
__tablename__ = 'chart'
id = Column(Integer, primary_key=True)
element_id = Column(Integer, ForeignKey('anotherTable.id'))
element = relationship(AnotherClass)
element2_id = Column(Integer, ForeignKey('anotherTable2.id'))
element2 = relationship(AnotherClass2)

我想根据 element_idelement2_id 进行查找:

class ExampleClass(Base):
...
def get_with_element2(self, element2):
return session.query(ExampleClass).\
filter_by(element_id = self.element_id,
element2_id = element2.id).first()

我发现的问题是,如果我实例化一个新的 ExampleClass 对象并为其分配一个 element,则不会设置 element_id 字段:

a = ExampleClass(element=element_obj)
a.element_id => None

我该如何解决这个问题?处理这种情况的最佳方法是什么?

最佳答案

首先,下面的所有示例都假定您的 ExampleClass 实例至少在 pending 中state 如果不是“持久”状态(即 session.add(a))。换句话说,如果您还没有与 Session 进行交互并且没有将 ExampleClass 对象添加到其中,那么您将不会获得任何数据库级别的relationship() 的行为,其中维护外键列值是主要特征。您当然可以直接进行此分配:

a = ExampleClass(element_id=element_obj.id)

但这显然没有利用 relationship() 构造提供的自动化。

relationship() 的外键属性分配发生在 flush 期间,这是一个仅在需要与数据库交互时才会发生的过程,例如在使用 session.query() 发出 SQL 语句之前或在使用 session.commit 完成事务之前()

一般来说,relationship() 的理念是您在这里只处理“element”和“element2”属性,而让外键属性在幕后处理。你可以这样写你的查询:

session.query(ExampleClass).\
filter_by(element=self.element).\
filter_by(element2=element2)

ORM 将进行比较,如 SomeClass.somerelationship=someobject 并将其转换为外键表达式 SomeClass.some_fk=some_id,但不同之处在于, "some_id"的最终值的评估延迟 直到执行查询之前。在执行查询之前,Query() 对象告诉 Session 进行“自动刷新”,这将导致您的 ExampleClass 行被与 element_obj 的主键标识符一起插入,该标识符被分配给 ExampleClass 对象的 element_id 属性。

你可以在仍然像这样使用 FK 属性的同时获得类似的效果,这主要只是为了了解它是如何工作的:

session.query(ExampleClass).\
filter_by(element_id=bindparam(callable_=lambda: self.element_id)).\
filter_by(element2_id=element2.id)

或者更明确地说,先进行冲洗:

session.flush()
session.query(ExampleClass).\
filter_by(element_id=self.element_id).\
filter_by(element2_id=element2.id)

因此,就您想要明确引用外键属性(如 element_id)而言,您还需要执行 relationship() 为你也明确地。如果您严格处理对象实例和 relationship() 绑定(bind)属性,并启用典型的默认设置,如 autoflush,它通常会做“正确的事情”并确保属性在需要时准备就绪。

关于python - SQLAlchemy - 设置关系时更新外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027876/

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