【问题标题】:Unique constraint failed - nice message if not unique key唯一约束失败 - 如果不是唯一键,则为好消息
【发布时间】:2024-06-19 02:40:01
【问题描述】:

假设我有一个可以添加如下值的数据库:

def information(cursor):
    a = input("Please define a 'a':")
    b = input("Please define a b:")
    c = input("Please define a c:")
    d = input("Please define a d:")
   
    statement=f'INSERT INTO data VALUES ({a}, "{b}", "{c}", "{d}");'
    cursor.execute(statement)
    cursor.close()

如果 Value 已经在表中,我如何才能收到一条好消息。

【问题讨论】:

标签: python sql


【解决方案1】:

我必须说,我对 Python 并不完全熟悉,尤其是它的 SQLite 驱动程序是如何工作的。

但解决方案的要点是有条件地插入,然后获取插入了多少行。在 SQL 的许多实现中,我们可以执行 SELECT @@ROWCOUNT 之类的操作,但我认为这在 SQLite 中行不通。

但我认为这可行,这取决于插入失败的唯一键:

INSERT OR IGNORE INTO data VALUES ({a}, "{b}", "{c}", "{d}");

然后获取行数:

cursor.rowcount

所以我们可以使用该结果来检查发生了什么。如果为零,则插入失败。

顺便说一句,我相信您当前的实现对 SQL 注入攻击是开放的。您应该改为在准备好的查询中使用参数。

【讨论】:

  • 我不擅长 Python,所以你必须解决这个问题。您想检查行数并基于 0 回复一条消息。
  • 如果你有一个唯一的约束,那么插入将失败,所以你可以检查行数。抱歉,你想要IGNORE 而不是ABORT
  • 好的,感谢您的反馈。如果您对如何实施有任何建议,请写在这里。