SQLAlchemy:插入顺序是否正确?

问题描述 投票:3回答:2

我有2个表(contractscontract_items),其中表的foreign key设置为第一个。

[当使用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行不存在还没有。

将数据传递给会话的add-function的顺序不是刷新数据的顺序吗?我实际上希望SQLAlchemy根据依赖关系自行找到刷新语句的正确顺序。应当清楚的是,当contract_item设置了contract的外键时,不应在contract_item行之前插入contract_item行。但是顺序似乎是随机的。

然后我尝试在添加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正确获得订单?

python orm sqlalchemy foreign-key-relationship
2个回答
-1
投票

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


0
投票

有同样的问题。在我的情况下,解决此问题的方法是创建一个[[biderictional relationship-您需要将relationshipcontracts更改为contract_items,如HERE]所述)UPD:实际上,您可以更简单地执行此操作:只需将relationship表中的contract_items添加到contract表中,即可完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.