Django DatabaseError - 没有这样的保存点

Gad*_*ady 4 python django postgresql celery

我的 Django 应用程序中有一个 Celery 任务调用的函数,它处理 CSV 文件中的每一行,并尝试使用模型将每一行中的信息插入到 PostgreSQL 数据库中,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

这发生在我从 Homebrew 安装了 PostgreSQL 9.1 的开发机器上。显然,主要目标是解决这个问题,但任何有助于调试 Celery 任务或定位我的 Postgres 日志文件的有用指针也会有帮助。

Gad*_*ady 5

在做了一些更多的研究之后,看起来这个问题的根本原因是IntegrityError试图强制保存点回滚,它不再存在。我修复了IntegrityError,我假设没有保存点的问题已经修复。在IntegrityError我调试时立即看到仍然会很棒......

使用这些指令启用日志记录,我看到生成的插入语句get_or_create违反了外键约束。