我在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:没有这样的保存点
然后我得到DatabaseError:当前事务中止,命令被忽略,直到此后每次迭代的事务块结束为止.
我已经成功地将记录插入(手动使用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日志文件的任何有用的指针也都将有所帮助.
解决方法:
After doing some more research,它的根本原因似乎在IntegrityError中,该错误试图强制执行保存点回滚,该回退已不存在.我修复了IntegrityError,并假设没有保存点问题已解决.在调试时立即看到IntegrityError仍然很棒…
使用these instructions启用了日志记录,我发现get_or_create生成的insert语句违反了外键约束.