Python SQLAlchemy:插入的刷新顺序错误?

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

我有两个表(合同合同项目),其中后者的外键设置为第一个

使用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 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有一个依赖项检查器,但它只查看关系,而不查看外键定义(尽管关系本身会查看这些键以确定其行为)