2009-07-31 17 views
1

Ich habe Python-Thread-Anwendung + Postgres. Ich verwende Django's ORM , um in Postgres zu speichern.
Ich habe gleichzeitige Speichern von Anrufen. Gelegentlich speichern 2 Threads mit dem gleichen Primärschlüssel , der zu einem Problem führt.Gewinde-Anwendung + IntegrityError

Postgres log:
ERROR: Nachschlüssel Wert gegen eindeutige Einschränkung "store_pkey"
STATEMENT: INSERT INTO "store" ("store_id", "Adresse") VALUES (E'HAN277' , E'101 Ozean Straße ')

Code:
Im Code sehe ich einen IntegrityError. Ich habe verschiedene Möglichkeiten ausprobiert dies zu handhaben.

a.
Versuch:
a.save()
außer IntegrityError:
Pass

Dies verursacht InternalError

b. Versuchte Transaktion Rolle zurück zu tun .. aber nicht sicher .. Soweit ich verstehen Sie deutliche müssen speichern Anrufe Transaktionen haben

 sid = transaction.savepoint() 
     try: 
     row.save() 
     except IntegrityError, e: 
     transaction.savepoint_rollback(sid) 
     pass 
     transaction.commit() 

Der erste Speicherpunkt nicht mit

Attribute: Objekt ‚NoneType‘ hat kein Attribut 'Cursor'

a. Ich lese irgendwo django ist nicht 100% threadsicher. Ist es eine gute Wahl in meinem Anwendungsfall. Ich benutzte bereits Django für andere Anwendungen und brauche ein ORM .. So wählte ich natürlich Django
b. Wie man mit dieser Situation umgeht .. Irgendwelche Kommentare.

Danke und Gruß, Ramya

Antwort

2

Nur um sicher zu machen, sind Sie Strings für Primärschlüssel zu verwenden, wenn ich das richtig verstanden?

AttributeError: 'NoneType' object has no attribute 'cursor'

Dies bedeutet, dass ein Fehler in einigen Python-Code ist. Hast du versucht, eine andere Version oder Revision von Django zu benutzen oder den Django Trac nach deinem Bug zu durchsuchen? Es ist nicht ungewöhnlich, von einem Fehler betroffen zu sein, wenn Sie die Version von trunk verwenden.

Alternativ können Sie auch versuchen, Django mit mehreren Prozessen anstelle von mehreren Threads zu implementieren, wenn dies eine Option ist.

Sie möchten jedoch immer noch herausfinden, warum Sie doppelte Anfragen erhalten, da dadurch möglicherweise ein anderer Fehler entdeckt wird.

+1

Yup .. Dank einer Tonne .. Ich war mit (1, 0, 2, 'final', 0) .. ich auf Version bewegt (1, 1, 0, 'final', 0) und Die Fehler sind verschwunden. – Ramya

Verwandte Themen