我正在使用Python使用psycopg2与Postgres DBMS进行通讯。
可以安全地假设如果INSERT返回而没有引发异常,那么INSERT实际上确实在数据库中存储了新内容吗?
现在,我一直在检查数据库游标的'rowcount'属性,如果它是0,则意味着INSERT失败。但是,我开始认为这是不必要的。
答案 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
... DO INSTEAD NOTHING
)(...可能还有更多,尽管没想到。)
常见的线程是,如果您告诉,它只会以一种或另一种方式影响零条记录。是否要将其中任何一个视为“故障”在很大程度上取决于您的应用程序逻辑。
任何毫无疑问的“失败”(约束冲突,序列化失败,磁盘空间不足...)都应该引发错误,因此通常不需要检查记录数。