次のように、CSV ファイルの各行を処理し、モデルを使用して各行から PostgreSQL データベースに情報を挿入しようとする Django アプリで、Celery タスクが呼び出す関数があります。
reader = csv.DictReader(csvfile, dialect=csv.get_dialect('excel'))
for row_number, row in enumerate(reader):
try:
...
customer, created = Customer.objects.get_or_create(
first_name = row['First Name'],
last_name = row['Last Name'],
email = row['Email'],
account_owner = account_owner
)
...
except Exception, e:
message = "%s: %s\n" % (type(e).__name__, e)
sys.stderr.write("%s\n" % message)
Customer.objects.get_or_create
ループの最初の反復で
次のエラーが発生します。DatabaseError: no such savepoint
そして、その後DatabaseError: current transaction is aborted, commands ignored until end of transaction block
の反復ごとに取得しています。
スクリプトが提供するのと同じ情報を使用して、このテーブルに (手動で SQL を使用して) レコードを正常に挿入しました。また、セーブポイントを操作しようとしましたが、うまくいきませんでした:
sid = transaction.savepoint()
customer, created = Customer.objects.get_or_create(
first_name = row['First Name'],
last_name = row['Last Name'],
email = row['Email'],
account_owner = account_owner
)
transaction.savepoint_commit(sid)
これは、Homebrew からインストールされた PostgreSQL 9.1 を備えた私の開発マシンで発生しています。明らかに、主な目標はこの問題を修正することですが、Celery タスクをデバッグしたり、Postgres ログ ファイルを見つけたりするための役立つポインタも役に立ちます。