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

SQLAlchemy: Flush-Order for Inserts wrong?

我有 2 个表(contractscontract_items),其中后者有一个 外键设置为第一个。

当使用 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 次运行,有时更多,有时更少。然后执行自动刷新的部分将以异常结束,告诉我无法插入 contract_item 因为它有 contract 的外键contract 行尚不存在。

我将数据传递给会话的附加函数的顺序不是刷新数据的顺序吗?我实际上希望 SQLAlchemy 能够找到正确的顺序来根据依赖关系自行刷新语句。应该清楚的是,contract_item行不应该插入到contract行之前,当contract_item 有一个 contract 集的外键。然而顺序似乎是随机的。

然后我尝试在添加 contract_item:

之前手动刷新 contract
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 得到正确的顺序?

会话处理相关对象的方式由cascades定义。在关系上使用 "save-update" 级联(默认启用)以自动添加相关对象,这样您只需使用一个 add 调用。我链接的文档包含代码示例。

有同样的问题。在我的案例中解决它的方法是创建一个 双向关系 - 你需要使 relationshipcontractscontract_items,如 HERE 所述]

UPD:实际上你可以做得更简单:只需将 relationshipcontract_items table 添加到 contract table 就可以了。