【问题标题】:PostgreSQL problem in DjangoDjango中的PostgreSQL问题
【发布时间】:2010-02-01 09:15:41
【问题描述】:

我有一个 Django 应用程序,我正在使用 postgres。我尝试在我的一项测试中执行折线:

print BillingUser.objects.all()

我收到以下错误:

“当前事务被中止,命令被忽略直到事务块结束。”

我的 postresql 日志:

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。

【问题讨论】:

  • 您确定不尝试在此打印行上方插入某处吗?您是否覆盖了BillingUser 类中的任何方法?更多代码会很有帮助。
  • 我的 tests.py 在这里:slexy.org/view/s21qJe144O 我的 models.py 在这里:slexy.org/view/s21EaSv1yu
  • 这个打印命令在哪一行?

标签: python sql django postgresql


【解决方案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()

但是,当您在检索用户后保存钱包时,它不知道您已经为他创建了一个钱包,并且具有 OneToOne 关系,这将导致您遇到的错误......我想什么你应该做的是在81之后添加一行:

    currency = Currency.objects.all()[2]
    if not Wallet.objects.filter(user=user):
        wallet = Wallet(user=user, currency=currency)
        wallet.save()
        user.wallet = wallet

这应该可以解决问题....

【讨论】:

    【解决方案2】:

    您在某些测试函数中插入数据。无效插入数据库连接后处于失败状态。您需要回滚事务或完全关闭它。请参阅 transactionstesting them 上的 django 文档。

    【讨论】:

      【解决方案3】:

      从日志看来,您正在尝试插入具有重复 ID 的项目,这会引发错误,并且您的其余代码无法再访问数据库。修复该查询,它应该可以工作。

      【讨论】:

      猜你喜欢
      • 2014-08-26
      • 2011-07-28
      • 1970-01-01
      • 2013-10-22
      • 2020-02-28
      • 2019-09-26
      • 2021-05-23
      • 1970-01-01
      • 2019-09-09
      相关资源
      最近更新 更多