Django DatabaseError - 没有这样的保存点

Posted

技术标签:

【中文标题】Django DatabaseError - 没有这样的保存点【英文标题】:Django DatabaseError - No such savepoint 【发布时间】:2012-12-29 21:23:27 【问题描述】:

我的 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 日志文件的指针也会有所帮助。

【问题讨论】:

嗨,你能粘贴你的 Customer.objects.get_or_create() 方法吗? 这只是内置的Django method 【参考方案1】:

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

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

【讨论】:

我编辑了您的答案以包含实际答案;因为问题中不应包含答案(如果包含,则不能很好地称为“问题”)。 “这些说明”很遗憾无法再访问。

以上是关于Django DatabaseError - 没有这样的保存点的主要内容,如果未能解决你的问题,请参考以下文章

Django DatabaseError:关系“django_site”

Django如何在DatabaseError后重新连接:查询超时

(DatabaseError: no such table: django_session) Django 1.3 selenium 测试期间的错误

Django DatabaseError timedelta的无效连接器

尝试重置密码时出现 Djongo + Django + MongoDB Atlas DatabaseError

DatabaseError:类型字符变化的值太长(100)