SQLAlchemy:插入的Flush-Order错误了吗?

时间:2015-10-02 18:05:47

标签: python orm sqlalchemy foreign-key-relationship

我有2个表(合同 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 ,因为它具有合同的外键和合同行尚不存在。

我将数据传递给会话的add-function的顺序不是刷新数据的顺序吗?我实际上希望SQLAlchemy能够找到正确的顺序来根据依赖关系刷新它自己的语句。应该很清楚, contract_item 行之前不应插入 contract_item 行,当 contract_item 具有合同<的外键时/ strong>设置。然而,顺序似乎是随机的。

然后我尝试在添加 contract_item 之前手动清除合同

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获得正确的订单?

2 个答案:

答案 0 :(得分:0)

有同样的问题。在我的情况下,解决此问题的方法是创建一种禁止关系-您需要将$json = file_get_contents('THE API URL'); $obj = json_decode($json, true); echo $obj['locations']['latLng']['lat']; relationshipcontracts,如HERE

UPD:实际上,您可以更简单地完成它:只需将contract_items表中的relationship添加到contract_items表中,就可以完成此操作。

答案 1 :(得分:-1)

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