为什么SQLAlchemy中的ForeignKey和RelationshipProperty属性不能自动同步?

奥尔连科

我试图弄清楚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不会反映基于其他更改的外键更改或关系更改。如果要在设置另一个属性时设置该属性,则可以使用Attribute Set事件。

通常建议您使用该关系并忽略外键,因为在设置关系时,SQLAlchemy将在后台执行很多不错的“魔术”操作。如果您希望外键执行相同的操作,请参见“更改FK时过期关系”配方。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么同步不能同步线程?

来自分类Dev

意图在android中是异步的。为什么不能同步呼叫?

来自分类Dev

为什么不能在颤动中更改凸起按钮的宽度和高度属性?

来自分类Dev

在PrintWriter中,为什么print()函数也不能自动刷新?

来自分类Dev

为什么我不能在Python中更改类的属性

来自分类Dev

为什么对象原型中的属性不能被对象修改?

来自分类Dev

为什么我不能在xcode中设置属性的值?

来自分类Dev

为什么不能设置属性的属性?

来自分类Dev

为什么需要重做自动映射?(SQLAlchemy)

来自分类Dev

为什么在sqlite3中自动递增主键列不能自动递增

来自分类Dev

为什么自动收缩不能正常工作?

来自分类Dev

Swift:为什么不能让懒惰的,计算的属性和属性观察器

来自分类Dev

Swift:为什么不能让懒惰的,计算的属性和属性观察器

来自分类Dev

为什么在MainWindow关闭后WPF窗口不能自动处理和收集?

来自分类Dev

Flask sqlAlchemy手册ORM:“ RelationshipProperty”对象没有属性“ parent”

来自分类Dev

为什么不能只读使用属性

来自分类Dev

为什么不能设置此对象属性?

来自分类Dev

为什么方法去覆盖,但属性不能?

来自分类Dev

为什么我不能访问对象的属性?

来自分类Dev

实例化对象会自动添加到SQLAlchemy Session中。为什么?

来自分类Dev

为什么既不能批量调用又不能在cmd中调用“ IF”和“ FOR”?

来自分类Dev

为什么不能在自动装配的初始化Spring bean的字段中设置模拟模仿?

来自分类Dev

当存在隐式转换时,为什么不能在DataGrid中自动转换类?

来自分类Dev

如果class属性是atomic,为什么不能自定义getter和setter?

来自分类Dev

如果class属性是atomic,为什么不能自定义getter和setter呢?

来自分类Dev

为什么不能将字段和属性声明为具有匿名类型?

来自分类Dev

为什么不能通过字典键和对象引用设置 .NET 对象属性值?

来自分类Dev

为什么在同步块中得到IllegalMonitorException?

来自分类Dev

为什么 Observable 类中的方法是同步的?

Related 相关文章

  1. 1

    为什么同步不能同步线程?

  2. 2

    意图在android中是异步的。为什么不能同步呼叫?

  3. 3

    为什么不能在颤动中更改凸起按钮的宽度和高度属性?

  4. 4

    在PrintWriter中,为什么print()函数也不能自动刷新?

  5. 5

    为什么我不能在Python中更改类的属性

  6. 6

    为什么对象原型中的属性不能被对象修改?

  7. 7

    为什么我不能在xcode中设置属性的值?

  8. 8

    为什么不能设置属性的属性?

  9. 9

    为什么需要重做自动映射?(SQLAlchemy)

  10. 10

    为什么在sqlite3中自动递增主键列不能自动递增

  11. 11

    为什么自动收缩不能正常工作?

  12. 12

    Swift:为什么不能让懒惰的,计算的属性和属性观察器

  13. 13

    Swift:为什么不能让懒惰的,计算的属性和属性观察器

  14. 14

    为什么在MainWindow关闭后WPF窗口不能自动处理和收集?

  15. 15

    Flask sqlAlchemy手册ORM:“ RelationshipProperty”对象没有属性“ parent”

  16. 16

    为什么不能只读使用属性

  17. 17

    为什么不能设置此对象属性?

  18. 18

    为什么方法去覆盖,但属性不能?

  19. 19

    为什么我不能访问对象的属性?

  20. 20

    实例化对象会自动添加到SQLAlchemy Session中。为什么?

  21. 21

    为什么既不能批量调用又不能在cmd中调用“ IF”和“ FOR”?

  22. 22

    为什么不能在自动装配的初始化Spring bean的字段中设置模拟模仿?

  23. 23

    当存在隐式转换时,为什么不能在DataGrid中自动转换类?

  24. 24

    如果class属性是atomic,为什么不能自定义getter和setter?

  25. 25

    如果class属性是atomic,为什么不能自定义getter和setter呢?

  26. 26

    为什么不能将字段和属性声明为具有匿名类型?

  27. 27

    为什么不能通过字典键和对象引用设置 .NET 对象属性值?

  28. 28

    为什么在同步块中得到IllegalMonitorException?

  29. 29

    为什么 Observable 类中的方法是同步的?

热门标签

归档