2014-11-24 76 views
3

我在做的10000條記錄批量插入到Postgres的:的PostgreSQL相當於MySQL的--force標誌

INSERT INTO TABLE VALUES (v1),...,(v10000) 

我通過Python的Psycopg2庫這樣做。目前,如果其中一個元組(例如5000號炸彈)(例如,如果某個字段的類型錯誤),則整個批量插入操作將失敗,因爲會生成異常。我正在尋找相當於MySQL的--force標誌來解決這個問題;它告訴MySQL繼續進行下去的任何錯誤(http://dev.mysql.com/doc/refman/5.0/en/mysql-command-options.html#option_mysql_force

我看不到任何東西在這裏,這是一個更新的PG,這是相當令人擔憂:http://www.postgresql.org/docs/9.3/static/sql-select.html

+0

炸彈是什麼? – 2014-11-24 20:46:57

+0

例如,「對於smallint」,值X太大「。我只想不插入所有違反某種數據插入錯誤並繼續前進的行。因爲我不提前知道所有可能的數據錯誤,所以我寧願不實施這個邏輯來在嘗試插入之前檢查元組......這是多麼噩夢。 – Tommy 2014-11-24 20:48:13

+0

我不認爲這是可能的。 Postgres的事務處理比MySQL更嚴格。 Postgres不支持只有部分語句可以被提交的事務,因爲它違反了事務的「原子」概念。這樣做的唯一方法就是使用單個插入和每個插入保存點。但那會很慢。 – 2014-11-24 21:23:32

回答

0

在PSQL \set ON_ERROR_ROLLBACK on做到這一點,並嘗試它再次

+0

作爲交易的一部分,我是否首先執行此操作?我正在通過Psycopg2進行交互,而不是本地的psql CLI。 – Tommy 2014-11-24 20:27:33

+0

據我所知,這隻能從psql客戶端完成。 – bhowden 2014-11-24 20:32:19

+1

是的,這對我沒有幫助。除非有些我可以永久設置這個東西。 – Tommy 2014-11-24 20:33:11

1

告訴psycopg你希望它使用事務隔離級別「autocommit」,即它不會爲你打開一個事務,並且每個語句都會自動提交。請注意,您必須捕獲異常並忽略(或更好地記錄)它們。例如:

import psycopg2 
import psycopg2.extensions 

conn = psycopg2.connect("...") 
conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) 
curs = conn.cursor() 

for row in your_data: 
    try: 
     curs.execute("INSERT INTO table VALUES (%s, %s, ...)", row) 
    except Exception, err: 
     print err 

# no need to commit! 
+0

批量插入是事務的一部分,如果事務中的其他事務失敗,則該事務必須回滾;這會影響嗎? – Tommy 2014-11-24 21:20:52

+0

當然。你不能在交易中「自動提交」*,對不起。如果我是你,我只需重新排列SQL:使用autocommit填充批量表;啓動一個事務,如果失敗,只需刪除行/刪除大量表。 – fog 2014-11-24 21:26:01