PostgreSQL允许您使用以下语法删除行并返回已删除行的列值:
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()
但仅此一项不会从游标返回任何值。或者它应该是:
rows = cur.fetchall()
,然后遍历行列表?
但是这个方法实际上会删除行吗?似乎缺少提交。
或者也许我应该同时写两个:
con.commit()
rows = cur.fetchall()
但我不确定这是否正确。试一试可能是一个选择,但如果你们中的一些人知道答案,那对我来说会更安全。
答案 0 :(得分:0)
您在事务内部查询运行(但最好仔细检查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
[]
提交,取消:
>>> cur.execute("DELETE FROM tmp_delete_test WHERE id < 4 RETURNING id;")
>>> con.commit()
>>> result = cur.fetchall()
>>> result
[(3,)]
因此,如果您不确定记录是否已被删除,我建议您使用第二个选项,但如果您需要在同一个事务中对该ID执行某些操作,则需要使用第一个选择。