Django DatabaseError - 没有这样的保存点

时间:2013-01-15 17:36:58

标签: 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)

我在循环的第一次迭代时在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日志文件的任何有用指针也会有所帮助。

1 个答案:

答案 0 :(得分:4)

After doing some more research,看起来它的根本原因是IntegrityError试图强制保存点回滚,它不再存在。我修复了IntegrityError,我认为修复了 no savepoint 问题。在我正在调试时,立即看到IntegrityError仍然会很棒......

使用these instructions启用日志记录,我发现get_or_create生成的insert语句违反了外键约束。