开发者

Django ORM without HTTP and commit_on_success decorator

I'm trying to use Django's ORM in my non-HTTP part of project.

In one function I need to make bulk inserts of data, so commit_on_success decorator is what I need.

But I've found that this decorator doesn't do what supposed (didn't rollback transaction on error).

I've go into this decorator with debugger, I've fount thar reason is in this code:

if is_dirty():
    rollback()

Is dirty allways ret开发者_高级运维urn true, so Django thought that transaction is allways clean.

And I'm geting "InternalError: current transaction is aborted, commands ignored until end of transaction block"

What can I do with this issue?


The decorator worksforme.

is_dirty being true sounds like the request is ... dirty (would be logical to issue a rollback only if it's dirty).

Hence the rollback seems to happen every time. Is your database transaction-aware (eg not myIsam tables) ? Do you do any commit() within your method ? If yes, it cannot be rolled back of course.

You can of course do it manually, by issuing a commit at the end of the bulk import (or, better, each chunk of N values inserted + 1 at the end if you don't mind have your data half-imported) and wrapping the whole block in a

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜