Django中的PostgreSQL问题

0 投票
3 回答
949 浏览
提问于 2025-04-15 18:44

我有一个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

这样应该就能解决问题……

0

你在一些测试函数里插入数据。可是当插入失败后,数据库连接就会处于错误状态。这时候你需要撤销之前的操作,或者完全关闭这个连接。可以查看Django的文档,了解关于事务如何测试它们的内容。

撰写回答