Skip to main content
 首页 » 编程设计

python之SQLAlchemy:插入的刷新顺序错误

2025年05月04日10think

我有 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 表中就可以了。