Code: Alles auswählen
activity = person.activities.find_or_create(kind='whatever')
activity.occurence += 1
Code: Alles auswählen
select * from activity where person_id=... and kind='whatever'
; falls es nicht existiert
insert into activity ('kind', 'occurences') values ('whatever', 0)
; bestimme jetzt last_insert_id oder wie das auch immer heißt
; ende von falls
update activity set occurence=occurence+1 where id=...
Wie auch immer, es sind mindestens zwei Befehle und dazwischen kann ein anderer Prozess Schaden anrichten, in dem er's auch versucht. Das ganze ist nicht atomar. Ich muss irgendwie die Tabelle in meiner Transaktion sperren.
Bitte nennt mir einen Python-ORM eurer Wahl und eine Lösung, wie und warum die funktioniert. Aus dunkler Vorzeit erinnere ich mich noch "select for update" als eine Lösung für das Problem, aber sowas ist Datenbank spezifisch und wo wäre der Sinn eines ORM, wenn ich nicht von SQL abstrahieren könnte?
Stefan