gpt4 book ai didi

python - 为什么 SQLAlchemy 中的 ForeignKey 和 RelationshipProperty 属性没有自动同步?

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:37 26 4
gpt4 key购买 nike

我正在尝试找出 SQLAlchemy 处理外键的方式。

考虑这些模型:

class ModelOne(Base):
__tablename__ = 'model_one'

id = Column(Integer, primary_key=True)
...

class ModelTwo(Base):
__tablename__ = 'model_two'

id = Column(Integer, primary_key=True)
one_id = Column(Integer, ForeignKey('model_one.id'))
one = relationship('ModelOne')

我假设如果我们有两个这样的模型,那么 SQLAlchemy 会发现 ModelTwo.one_id 和 ModelTwo.one 指的是同一个数据库列。

创建 ModelTwo 记录时,我们可以使用 ModelOne 记录的数字 ID,或 ModelOne 实例来填充 FK 字段:

one = DBSession.query(ModelOne)....
two_a = ModelTwo(one_id=one.id)
two_b = ModelTwo(one=one)

这行得通。

但这里有一个转折:在实例化 ModelTwo 实例之后,根据我们初始化 FK 字段的方式,它的一个或另一个表示将保持未填充状态:

two_a.one is None # evaluates to True
two_b.one_id is None # evaluates to True

这是预期的行为吗?如果是这样,这一定是开发人员头脑中的一个巨大的危险信号。当我们从数据库中检索一条记录作为声明性模型类的实例时,record.one 和 record.one_id 都会被填充,但是当我们创建一条新记录时,情况并非如此!

最佳答案

这是标准行为。在提交之前,SQLAlchemy 不会反射(reflect)外键更改或基于其他更改的关系更改。如果您想在设置其他属性时设置该属性,您可以使用 Attribute Set事件。

通常鼓励您使用关系并忽略外键,因为 SQLAlchemy 会在设置关系时在后台执行很多不错的“魔法”。如果您希望外键执行同样的魔术,请参阅 Expire Relationship on FK Change食谱。

这只是我现在的看法,但这不是“危险信号”。您应该改为构建您的程序,以避免在新的或更新的实例与持久实例之间进行比较。

关于python - 为什么 SQLAlchemy 中的 ForeignKey 和 RelationshipProperty 属性没有自动同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24685814/

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