views:

185

answers:

3

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 error:

"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.

A: 

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.

Max Shawabkeh
yes, but I am just printing. I don't insert anything
alexarsh
The insert must be happening somewhere before the printing line. Possibly quite far.
Max Shawabkeh
My tests.py is here: http://slexy.org/view/s21qJe144Omy models.py is here: http://slexy.org/view/s21EaSv1yu
alexarsh
A: 

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.

Dmitry Shevchenko
thanks, it solved my problem. you're great!
alexarsh
+1  A: 

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....

Julian