明确检查SQL INSERT操作是否成功是否不必要?

时间:2019-02-25 20:48:57

标签: python postgresql psycopg2

我正在使用Python使用psycopg2与Postgres DBMS进行通讯。

可以安全地假设如果INSERT返回而没有引发异常,那么INSERT实际上确实在数据库中存储了新内容吗?

现在,我一直在检查数据库游标的'rowcount'属性,如果它是0,则意味着INSERT失败。但是,我开始认为这是不必要的。

3 个答案:

答案 0 :(得分:1)

在这里How to check if value is inserted successfully or not?找到了类似的问题

他们似乎使用行计数方法来检查数据是否正确插入。

答案 1 :(得分:1)

默认情况下,postgres将返回None以成功插入:

  

cursor.execute-方法返回None。如果执行了查询,则可以使用fetch *()方法检索返回的值。

http://initd.org/psycopg/docs/cursor.html

如果您想了解有关插入的一些信息,一种简单/有效的方法是使用RETURNING(与SELECT相同的选项):

INSERT INTO ... RETURNING id

答案 2 :(得分:1)

  

可以安全地假设如果INSERT返回而没有引发   例外,那么INSERT实际上确实在   数据库?

否。

在以下情况下,受影响的记录数将为零:

  • 您运行了INSERT INTO ... SELECT ...,查询没有返回任何行
  • 您运行了INSERT INTO ... ON CONFLICT DO NOTHING,但遇到了冲突
  • 您的桌上有BEFORE INSERT trigger,而trigger function返回了NULL
  • 您已定义了rule,不会导致任何记录受到影响(例如... DO INSTEAD NOTHING

(...可能还有更多,尽管没想到。)

常见的线程是,如果您告诉,它只会以一种或另一种方式影响零条记录。是否要将其中任何一个视为“故障”在很大程度上取决于您的应用程序逻辑。

任何毫无疑问的“失败”(约束冲突,序列化失败,磁盘空间不足...)都应该引发错误,因此通常不需要检查记录数。