沉默sqlite中的唯一约束错误

时间:2017-11-21 10:22:52

标签: sqlite csv stderr

我正在将CSV加载到sqlite db,如下所示:

sqlite3 /path/to/output.db < /path/to/sqlite_commands.sql

sqlite命令文件如下所示:

sqlite_commands.sql

CREATE TABLE products (
"c1" TEXT PRIMARY KEY NOT NULL,
"c2" TEXT,
"c3" TEXT
);
.mode csv

.import /tmp/csv_with_dups.csv products

并且csv看起来像

/tmp/csv_with_dups.csv

c1,c2,c3
a,b,c
b,c,d
c,d,e
d,e,f
a,a,b
e,f,g

我收到stderr的错误

/tmp/csv_with_dups.csv.tmp:6: INSERT failed: UNIQUE constraint failed: products.c1

我想要解决这个错误,因为我们知道有些csv有重复(csv是由非常大的数据集上的单独机制生成的,无法在该阶段验证重复)

我已尝试根据文档添加此行

.log off 

also tried
.log stderr|off

also tried 
.log stderr off

sqlite3
.help
...
.log FILE|off          Turn logging on or off.  FILE can be stderr/stdout
...

1 个答案:

答案 0 :(得分:1)

“INSERT failed”消息始终打印到stderr。

您可以忽略stderr,但这也会抑制所有其他错误消息:

sqlite3 ... 2>/dev/null

或者,自己生成SQL命令,以便可以使用INSERT OR IGNORE:

import sys
import csv

def quote_sql_str(s):
    return "'" + s.replace("'", "''") + "'"

print('BEGIN;')
with open(sys.argv[1], 'rb') as file:
    for row in csv.reader(file):
        print('INSERT OR IGNORE INTO products VALUES({});'
              .format(','.join([quote_sql_str(s) for s in row])))
print('COMMIT;')
python script.py csv_with_dups.csv | sqlite3 /path/to/output.db

或者,导入没有约束的临时表,然后使用INSERT或IGNORE复制到真实表中。