我有 2 个表(contracts 和 contract_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 行尚不存在。
我将数据传递给 session 的附加函数的顺序不是刷新数据的顺序吗?我实际上希望 SQLAlchemy 能够找到正确的顺序来根据依赖关系自行刷新语句。应该清楚的是,当 contract_item 具有指向 contract< 的外键时,不应将 contract_item 行插入到 contract 行之前/strong> 设置。然而顺序似乎是随机的。
然后我尝试在添加 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()
这没有任何问题,行被插入到数据库中。
有什么方法可以设置为 session 刷新语句的顺序吗? SQLAlchemy 真的不关心外键等依赖关系,还是我在添加数据时犯了错误?如果可能的话,我宁愿不手动管理刷新。
有没有办法让 SQLAlchemy 得到正确的顺序?
请您参考如下方法:
遇到了同样的问题。在我的案例中解决它的方法是创建一个双向关系 - 你需要建立从contracts到contract_items的relationship,如所述HERE
UPD:实际上你可以更简单地做到这一点:只需将 contract_items 表中的 relationship 添加到 contract 表中就可以了。
