2015-10-02 36 views
0

我有2個表(合同contract_items),其中後者具有外鍵設置爲第一個。SQLAlchemy:嵌入順序插入錯誤?

使用的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無法插入,因爲它有一個外鍵合同合同行尚不存在結束。

是我將數據傳遞給會話的附加函數的順序,而不是數據刷新的順序?實際上,我希望SQLAlchemy能夠根據依賴性找到正確的順序來清除它自己的語句。應該明確的是,contract_item行不應該合同行之前插入,當contract_item有一個外鍵合同集。然而這個命令似乎是隨機的。

然後我嘗試添加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獲得正確的訂單?

回答

-1

會話處理相關對象的方式由cascades定義。在關係上使用"save-update"級聯(默認情況下啓用)以自動添加相關對象,以便您只需使用一個add調用。我鏈接的文檔包含代碼示例。

+0

謝謝!那樣做了。 – Endauriel