gpt4 book ai didi

python - pysqlite 的 IntegrityError : distinguish 'NOT NULL' from 'UNIQUE' violation

转载 作者:IT王子 更新时间:2023-10-29 06:19:47 26 4
gpt4 key购买 nike

在 pysqlite 中,违反 NOT NULLUNIQUE 约束同样会引发 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()

最佳答案

这就是我最终做的:

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:
if any(elem is None for elem in (a, b, c, d)):
raise ValueError('Fields must not be empty.')
con.execute('INSERT OR IGNORE INTO ABCD VALUES (?, ?, ?, ?)',
(a, b, c, d))
con.close()

像这样,在执行数据库操作之前“手动”捕获空值。如果在 execute 期间发生任何错误(例如违反 UNIQUE 约束),则跳过该条目。请注意,INSERT OR IGNORE 并不意味着忽略唯一性约束,而是忽略(即跳过)输入行。

此解决方案的缺点是对空值的检查进行了两次。不过,我想这还不算太糟糕,因为这大概是一项相当便宜的手术。我认为,它仍然比解析错误消息更清晰,并且可能对更改更健壮(例如 pysqlite 更新,它可能会更改错误消息中的某些细节)。

致谢:这个想法源于与 Lutz 的讨论。这也是 Martijn 独立提出的。

关于python - pysqlite 的 IntegrityError : distinguish 'NOT NULL' from 'UNIQUE' violation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24246096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com