4

次のように、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 ログ ファイルを見つけたりするための役立つポインタも役に立ちます。

4

1 に答える 1

5

さらに調査を行った後、これの根本的な原因は、IntegrityErrorもう存在しないセーブポイントのロールバックを強制しようとすることにあるようです。を修正し、セーブポイントなしのIntegrityError問題が修正されたと思います。それでも、私がデバッグしているときにすぐに見るのは素晴らしいことです...IntegrityError

これらの命令を使用してロギングを有効にすると、によって生成された挿入ステートメントget_or_createが外部キー制約に違反していることがわかります。

于 2013-01-15T22:16:27.480 に答える