我正在将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
...
答案 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复制到真实表中。