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