如何从 python 中的游标中删除和 return 值

How to delete and return values from cursor in python

PostgreSQL 允许您使用以下语法删除行和 return 已删除行的列值:

DELETE FROM [table_name] RETURNING [column_names]

我想在 Python 中使用此语法并使用 psycopg2 库。所以我写:

cur = con.cursor()

cur.execute('DELETE FROM [my_table_name] RETURNING [column_name, let's say id]')

现在不知道写什么了。应该是:

con.commit()

但这本身并不能 return 来自游标的任何值。或者应该是:

rows = cur.fetchall()

,然后遍历行列表?

但是这个方法真的会删除行吗?似乎缺少提交。

或者我应该都写,像这样:

con.commit()

rows = cur.fetchall()

但我不确定这是否正确。尝试一下可能是一种选择,但如果你们中的一些人知道答案,那对我来说会更安全。

您的查询在事务内部运行(但最好仔细检查 autocommit 是否设置为 False),这意味着您所做的所有更改仅对您可见(实际上,这取决于其他人)事务设置),直到您提交这些更改。

在这种情况下两种选择都有效:

>>> con = db()
>>> cur = con.cursor()
>>> cur.execute("DELETE FROM tmp_delete_test WHERE id < 3 RETURNING id;")
>>> result = cur.fetchall()
>>> result
[(1,), (2,)]
>>> con.commit()
>>> cur.execute("DELETE FROM tmp_delete_test WHERE id < 3 RETURNING id;")
>>> result = cur.fetchall()
>>> result
[]

并提交,fetchall:

>>> cur.execute("DELETE FROM tmp_delete_test WHERE id < 4 RETURNING id;")
>>> con.commit()
>>> result = cur.fetchall()
>>> result
[(3,)]

因此,如果您不需要确定记录是否确实已被删除,我建议您使用第二个选项,但如果您需要在同一事务中对这些 ID 执行某些操作,则需要使用第一个选项。