Django ORM没有HTTP和commit_on_success装饰器

时间:2010-03-05 11:33:10

标签: django orm django-models transactions

我正在尝试在我的非HTTP部分项目中使用Django的ORM。

在一个函数中,我需要批量插入数据,因此commit_on_success装饰器就是我所需要的。

但我发现这个装饰器没有做假设的事情(错误时没有回滚事务)。

我已经使用调试器进入这个装饰器,我已经知道了这个代码中的原因:

if is_dirty():
    rollback()

脏的总是返回true,所以Django认为交易总是很干净。

我正在调整“InternalError:当前事务被中止,命令被忽略,直到事务块结束”

这个问题该怎么办?

1 个答案:

答案 0 :(得分:1)

装饰工作。

is_dirty是真的听起来像请求是......脏的(只有在它变脏的情况下才会发出回滚的逻辑)。

因此每次回滚似乎都会发生。 您的数据库是否有事务感知(例如,不是myIsam表)? 你在方法中做了任何commit()吗?如果是,它当然不能回滚。

您当然可以手动执行此操作,方法是在批量导入结束时发出提交(或者,更好的是,如果您不介意将数据半导入,则最后插入N个值的每个块+ 1并将整个块包装在

try : 
  do_whatever_inserts
except : 
  db.rollback()
  raise
else : 
  db.commit()