Python sqlite3如果executemany()在途中遇到完整性错误会怎样?

时间:2018-10-21 04:01:22

标签: python sql python-3.x sqlite executemany

如果我运行SQL命令

INSERT INTO my_table VALUES (?);

受约束

CREATE my_table(
    user_name VARCHAR(255) PRIMARY KEY
);

在列表executemany()上使用sqlite3的['a', 'b', 'c', 'd', 'e', 'f', 'a', 'b', 'g', 'h', 'i']命令,我将得到一个sqlite3.IntegrityError

我对executemany()遇到此错误时的行为有一些疑问,我无法找到有关该行为的任何文档。

1)在异常之前插入的值是否始终不变?

2)是否有可能在异常发生后的之后插入值?

3)有什么方法可以确定哪个值导致异常? (我能想到的最好的方法是将列表包装在生成器中,以跟踪状态,记录问题条目,并在生成器的其余部分重试,直到整个列表被消耗为止。)

1 个答案:

答案 0 :(得分:0)

下面的测试脚本提供了一些证据:

  1. 在完整性约束之前插入的值似乎是完整的
  2. 未插入异常后要插入的值
  3. 不是我发现的-我使用了与您建议的解决方案类似的方法。

请注意,如果要防止在发生IntegrityError时插入任何值,则可以使用事务。下面的例子。另请参见here

import sqlite3
conn = sqlite3.connect('del.db')
tuples = ('a','b','c','a','d')

conn.execute('create table test (col text primary key)')

conn.commit()
c = conn.cursor()
try:
    c.executemany('insert into test  values (?)', tuples)
except sqlite3.IntegrityError as exc:
    print(exc)

c.close()

results = conn.execute('select * from test')
results.fetchall()

产生以下输出

UNIQUE constraint failed: test.col
[('a',), ('b',), ('c',)]

如果您使用交易:

c = conn.cursor()
c.execute('begin')
try:
    c.executemany('insert into test  values (?)', tuples)
except sqlite3.IntegrityError as exc:
    c.execute('rollback')

未输入任何数据。