我正在尝试在我的非HTTP部分项目中使用Django的ORM。
在一个函数中,我需要批量插入数据,因此commit_on_success装饰器就是我所需要的。
但我发现这个装饰器没有做假设的事情(错误时没有回滚事务)。
我已经使用调试器进入这个装饰器,我已经知道了这个代码中的原因:
if is_dirty():
rollback()
脏的总是返回true,所以Django认为交易总是很干净。
我正在调整“InternalError:当前事务被中止,命令被忽略,直到事务块结束”
这个问题该怎么办?
答案 0 :(得分:1)
装饰工作。
is_dirty是真的听起来像请求是......脏的(只有在它变脏的情况下才会发出回滚的逻辑)。
因此每次回滚似乎都会发生。 您的数据库是否有事务感知(例如,不是myIsam表)? 你在方法中做了任何commit()吗?如果是,它当然不能回滚。
您当然可以手动执行此操作,方法是在批量导入结束时发出提交(或者,更好的是,如果您不介意将数据半导入,则最后插入N个值的每个块+ 1并将整个块包装在
中try :
do_whatever_inserts
except :
db.rollback()
raise
else :
db.commit()