如何从 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 执行某些操作,则需要使用第一个选项。
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 执行某些操作,则需要使用第一个选项。