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

标签 python sql python-3.x sqlite executemany

如果我运行 SQL 命令

INSERT INTO my_table VALUES (?);

有约束

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

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

我对 executemany() 遇到此错误时的行为有几个疑问,但我一直找不到有关该行为的任何文档。

1) 在异常之前插入的值是否始终完好无损?

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

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

最佳答案

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

  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')

没有输入数据。

关于Python sqlite3 如果 executemany() 中途遇到完整性错误会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52912010/

相关文章:

javascript - 在流中传递 ID3 信息并在前端进行解析

python - SQLAlchemy 声明中基于对象的默认值

python - 在与 Python 2.7 中的元组中的单词相匹配的列表中总结成员元素的值

php - 错误 ODBC MS SQL

python - 没有这样的文件或目录 : 'gs' linux

python - 了解python的主要方法

python - Django HTML5 样板页眉和页脚

sql - 计算 SQL 中不同多列的出现次数

sql - 如何在 Oracle SQL 查询中处理/使用百分比 (%) 和与号 (&) 等特殊字符

Python3 HTMLTestRunner 不生成报告