Python SQLAlchemy:插入的刷新顺序错误?
我有两个表(合同和合同项目),其中后者的外键设置为第一个 使用SQLAlchemy将列表中的新数据插入我的postgre数据库时,我基本上做了以下工作:Python SQLAlchemy:插入的刷新顺序错误?,python,orm,sqlalchemy,foreign-key-relationship,Python,Orm,Sqlalchemy,Foreign Key Relationship,我有两个表(合同和合同项目),其中后者的外键设置为第一个 使用SQLAlchemy将列表中的新数据插入我的postgre数据库时,我基本上做了以下工作: for row in list: # Get contract and item from row ... session.add(contract) session.add(contract_item) # Do some select statements (which will raise a
for row in list:
# Get contract and item from row
...
session.add(contract)
session.add(contract_item)
# Do some select statements (which will raise an auto-flush)
...
session.commit()
现在。。。这可能适用于2-3次跑步,有时更多,有时更少。然后,执行自动刷新的部分将以异常结束,告诉我无法插入合同项目,因为它有一个指向合同的外键,并且合同行还不存在
我将数据传递给会话的add函数的顺序是否不是刷新数据的顺序?实际上,我希望SQLAlchemy能够找到正确的顺序,根据依赖关系刷新自己的语句。应该清楚的是,当合同项目设置了一个外键时,合同项目行不应插入到合同行之前。然而,顺序似乎是随机的
然后,在添加合同项目之前,我尝试手动刷新合同:
for row in list:
# Getting contract and item from row
...
session.add(contract)
session.flush() # Flushing manually
session.add(contract_item)
# Do some select statements (which will raise an auto-flush)
...
session.commit()
这样做没有任何问题,行被插入到数据库中
有没有办法设置会话刷新语句的顺序?SQLAlchemy真的不关心外键之类的依赖关系,还是我在添加数据时犯了错误?如果可能的话,我宁愿不要手动管理冲水
有没有办法让SQLAlchemy获得正确的顺序?会话处理相关对象的方式由定义。在关系上使用
“保存更新”
级联(默认情况下启用)自动添加相关对象,这样您只需使用一个添加
调用。我链接的文档包含代码示例。也有同样的问题。在我的案例中,解决这个问题的方法是创建一个双摩擦关系——您需要将关系
从合同
到合同项目
,如前所述
UPD:实际上你可以做得更简单:只需将
关系
从合同项目
表添加到合同
表,就可以了 这是正确答案–添加关系
。它不会影响基础表架构。SQLAlchemy有一个依赖项检查器,但它只查看关系,而不查看外键定义(尽管关系本身会查看这些键以确定其行为)