Django中的PostgreSQL问题
我有一个Django应用程序,使用的是PostgreSQL数据库。在我的一个测试中,我尝试执行以下代码:
print BillingUser.objects.all()
结果我遇到了一个错误:
“当前事务已中止,直到事务结束之前的命令都会被忽略。”
这是我的PostgreSQL日志:
ERROR: duplicate key value violates unique constraint "billing_rental_wallet_id_key"
STATEMENT: INSERT INTO "billing_rental" ("wallet_id", "item_id", "end_time", "time", "value", "index", "info") VALUES (61, 230, E'2010-02-11 11:01:01.092336', E'2010-02-01 11:01:01.092336', 10.0, 1, NULL)
ERROR: current transaction is aborted, commands ignored until end of transaction block
STATEMENT: INSERT INTO "billing_timeable" ("creation_date", "update_date") VALUES (E'2010-02-01 11:01:01.093504', E'2010-02-01 11:01:01.093531')
ERROR: current transaction is aborted, commands ignored until end of transaction block
STATEMENT: SELECT "billing_timeable"."id", "billing_timeable"."creation_date", "billing_timeable"."update_date", "billing_billinguser"."timeable_ptr_id", "billing_billinguser"."username", "billing_billinguser"."pin", "billing_billinguser"."sbox_id", "billing_billinguser"."parental_code", "billing_billinguser"."active" FROM "billing_billinguser" INNER JOIN "billing_timeable" ON ("billing_billinguser"."timeable_ptr_id" = "billing_timeable"."id") LIMIT 21
我该如何解决这个问题呢?
谢谢,Arshavski Alexander。
3 个回答
0
从日志来看,你似乎在尝试插入一个重复的ID,这会导致错误,之后你的代码就无法再访问数据库了。修正这个查询,应该就能正常工作了。
1
好的……从PostgreSQL的日志来看,你的插入操作确实有问题,这会导致事务中止……现在看看你的代码,我觉得问题出在这里:
在第78到81行
currency = Currency.objects.all()[2]
if not Wallet.objects.filter(user=user):
wallet = Wallet(user=user, currency=currency)
wallet.save()
你会为当前用户创建一个钱包,但在第87到88行你写了:
user.wallet.amount = 12.0
user.wallet.save()
然而,当你在获取用户后保存钱包时,系统并不知道你已经为他创建了一个钱包。而由于你设置的是一对一的关系,这就会导致你遇到的错误……我觉得你应该在第81行后面加一行:
currency = Currency.objects.all()[2]
if not Wallet.objects.filter(user=user):
wallet = Wallet(user=user, currency=currency)
wallet.save()
user.wallet = wallet
这样应该就能解决问题……