【发布时间】:2014-08-06 10:04:57
【问题描述】:
在 pysqlite 中,违反 NOT NULL 或 UNIQUE 约束同样会引发 IntegrityError。
不幸的是,这种 Exception 类型不提供错误代码,而只提供一条消息。
所以,假设我想忽略违反唯一约束的行为,因为我知道这对给定数据是安全的,但应该报告键列中的 Null 值。
我想出了以下解决方案:
con = sqlite3.connect(':MEMORY:')
con.execute('''CREATE TABLE ABCD (A TEXT NOT NULL,
B TEXT NOT NULL,
C TEXT NOT NULL,
D TEXT NOT NULL,
PRIMARY KEY (A, B))''')
with con:
for a, b, c, d in inputs:
try:
con.execute('INSERT INTO ABCD VALUES (?, ?, ?, ?)',
(a, b, c, d))
except sqlite3.IntegrityError as e:
# Skip 'not unique' errors, but raise others.
if not e.message.endswith('not unique'):
raise
con.close()
但是,解析错误消息似乎是错误的,并且可能不可靠。
有没有更好的方法来做到这一点,甚至可以使用con.executemany()?
【问题讨论】:
-
我没有回答你的问题。但是我想知道如果可以安全地忽略约束有什么用?为什么不直接放弃呢?在您的示例代码
(A, B)中,您是PK。我认为这个约束不能被忽视。什么是真实世界的用例? -
唯一约束不被忽略,输入行被忽略。输入应包含这些字段上的重复项,我正在默默地跳过重复项。
-
您可以在将输入传递给 SQLite 之前过滤输入并删除所有重复项。
-
仅在键列中根据 NULL 值对数据进行预过滤要容易得多。忽略非唯一键就像使用
INSERT OR IGNORE一样简单。 -
查看 pysqlite 和 sqlite3 源代码,表明您正在寻找的返回错误代码是 #define SQLITE_CONSTRAINT 19 并且对于所有违反约束的约束类型都是相同的。这与 SQLITE_MISMATCH 一起映射到pysqlite IntegrityException.Parsing 与该异常相关的错误消息似乎是在不向绑定和 sqlite3 添加新功能的情况下区分情况的唯一方法。