开发者

PostgreSQL problem in Django

I have a Django application and I'm using postgres. I try to execute the bollowing line in one of my tests:

print BillingUser.objects.all()

And I get the following er开发者_开发知识库ror:

"current transaction is aborted, commands ignored until end of transaction block."

My postresql log:

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

How can I fix that?

Thanks, Arshavski Alexander.


Ok... looking at the PostgreSQL log, it does look that you are doing a wrong insert that will abort the transaction... now, looking at your code I think the problems lies here:

at lines 78-81

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

You will create a wallet for the current user, but then on line 87-88 you wrote:

    user.wallet.amount = 12.0
    user.wallet.save()

However, as you save the wallet after retrieving the user, it does not know that you had already created a wallet for him, and having a OneToOne relationship, this will cause the error you're having... I think what you should do is to add a line after 81:

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

That should solve the issue....


You insert data in some of your test functions. After invalid insert DB connections is in fail state. You need to rollback transaction or turn it off completely. See django docs on transactions and testing them.


From the log it looks like you are trying to insert an item with a duplicate ID which throws an error and the rest of your code can't access the DB anymore. Fix that query, and it should work.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜