這是問題陳述的再現。
兩個表(sayTab1和Tab2)的資料庫模式已在名為 (say) 的檔案中給出schemas.ddl。這兩個表之間存在多個完整性約束(包括外鍵)。這兩個表的資料分別在data1.csv和中給出data2.csv。我需要從這些 csv 檔案中獲取資料到表中。
我就是這樣做的:
import psycopg2
conn = psycopg2.connect(database=postgres, user=postgres, host=localhost, port=5432)
cur = conn.cursor()
# Execute the schema, this works fine
cur.execute(open(schemas.ddl, "r").read())
files = ["data1.csv", "data2.csv"]
# Iterate through files to add data
for i in range(1,3):
copy_sql = "copy Tab" str(i) " from stdin with csv header delimiter as ',' null as 'null'"
with open(files[i-1],'r') as f:
cur.copy_expert(sql=copy_sql, file=f)
也就是說,我使用copy_expert()如圖所示復制第一個檔案的資料,然后復制第二個檔案的資料。然而,這會導致在輸入資料時違反外鍵約束(和其他自定義約束)。
有沒有辦法在提交時檢查輸入資料的完整性,而不是在每個命令之后檢查?我試過cur.execute("SET CONSTRAINTS ALL DEFERRED;")了,但這并沒有改變任何東西。
解決方案
阿南德·索米蒂蘭
只需將外鍵和約束設定為deferrable. 例子:
Foreign Key(A) references B deferrable;
或者,如果您相信資料是正確的,只需禁用所有觸發器并在復制后重新啟用它們。
uj5u.com熱心網友回復:
最初必須使用 DEFERRABLE 創建這些 FK 約束,然后才能使用 SET 命令將其延遲。或者,您可以關閉所有triggers這 2 個表,然后執行批量復制操作,然后啟用觸發器。PG 使用觸發器來強制執行 FK 約束。
ALTER TABLE tab2 DISABLE TRIGGER ALL;
--run your program---
--and then enable triggers
ALTER TABLE tab2 ENABLE TRIGGER ALL;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/414859.html
標籤:
上一篇:CSV讀入MySQLdb失敗
