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

时间:2014-08-31 14:14:23

标签: python django cursor database-connection django-database

我打开一个游标,其中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()

1 个答案:

答案 0 :(得分:3)

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

Django documentation说明了这种特殊情况:

  

如果您正在连续执行多个自定义SQL查询,请立即执行每个查询   在自己的交易中运行,而不是共享相同的“自动”   交易”。如果你需要强制执行原子性,你必须包装   atomic()中的查询序列。

因此,每个execute()调用的结果都在它之后提交,但我们希望它们全部通过,或者全部失败 - 作为一组更改。

使用transacton.atomic装饰器包裹视图:

from django.db import transaction

@transaction.atomic
def my_view(request):
    c = connection.cursor()
    try:
        c.execute('delete from table_a')
        c.execute('delete from table_b')
    finally:
        c.close()

请注意,Django 1.6中引入了atomic()和整个new transaction management system

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