如何在python中从游标中删除和返回值

时间:2016-09-26 04:18:42

标签: python postgresql cursor psycopg2 delete-operator

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()

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

1 个答案:

答案 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执行某些操作,则需要使用第一个选择。