我有一个函数,我的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日志文件的任何有用指针也会有所帮助。
答案 0 :(得分:4)
After doing some more research,看起来它的根本原因是IntegrityError
试图强制保存点回滚,它不再存在。我修复了IntegrityError
,我认为修复了 no savepoint 问题。在我正在调试时,立即看到IntegrityError
仍然会很棒......
使用these instructions启用日志记录,我发现get_or_create
生成的insert语句违反了外键约束。