在django中的单个connection.cursor上执行多个。安全吗?

Dan*_*ini 4 python django database-connection django-database database-cursor

我正在使用 connection.cursor 打开一个游标,执行一系列删除操作,然后关闭游标。它有效,但我不确定它是否有任何副作用。如有任何反馈,我们将不胜感激。

from django.db import connection
c=connection.cursor()
try:
    c.execute('delete from table_a')
    c.execute('delete from table_b')
    ...
finally:
    c.close()
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 5

由于您不在事务中执行这些 SQL 语句,因此您可能会遇到令人困惑的状态(例如,数据已从 中删除table_a,但未从 中删除)table_b)。

\n\n

Django 文档描述了这种特殊情况:

\n\n
\n

如果您\xe2\x80\x99 连续执行多个自定义 SQL 查询,则每个查询现在\n 都在自己的事务中运行,而不是共享相同的\xe2\x80\x9c 自动\n 事务\xe2\x80\x9d。如果需要强制执行原子性,则必须将查询序列包装在atomic() 中。

\n
\n\n

所以,每个结果execute()调用的结果都会在其之后立即提交,但我们希望它们要么全部通过,要么全部失败 - 作为一组更改。

\n\n

用一个包裹视图transacton.atomic

\n\n
from django.db import transaction\n\n@transaction.atomic\ndef my_view(request):\n    c = connection.cursor()\n    try:\n        c.execute(\'delete from table_a\')\n        c.execute(\'delete from table_b\')\n    finally:\n        c.close()\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意atomic(),整个新的交易管理系统 Django 1.6 中引入了

\n\n

如果您使用的是 Django < 1.6,请申请transaction.commit_on_success装饰器。

\n