TechLife devBlog

Django i zduplikowane wartości kluczy

Internet 24th Jan 2011

Django przy współpracy z Postgresem odstawiło dzisiaj niezłą scenę. Galeria na stabilnie działającej od ponad roku stronie nagle wysypała się przy dodawaniu kolejnych zdjęć, pod pretekstem podwójnych wartości kluczy w tabeli przechowującej pliki galerii.

IntegrityError: duplicate key value violates unique constraint "galeria_plik_pkey"

No więc sprawdzam.

SELECT max(id) FROM galeria_plik;
1573
SELECT nextval('galeria_plik_id_seq'::regclass) FROM galeria_plik;
1526

Great Scott! WTF? Ktoś zakłócił kontinuum! Nie mam pojęcia jak stabilnie działający PostgreSQL mógł nagle tak machnąć się w numeracji... Jeżeli traficie na coś podobnego nie pozostaje nic innego jak zresetowanie indeksu tabeli z właściwym numerem, jaki powinien posiadać kolejny wiersz.

ALTER SEQUENCE galeria_plik_id_seq RESTART with 1574;

I powinno działać. Komuś zdarzyło się coś podobnego?

PS. Python jednak ryje beret. Dzisiaj ułożyłem takie oto zapytanie:

FROM galeria_plik SELECT max(id);

Komentarze z jogger.pl

occulkot 24.01.2011 / 22:31

mozna jeszcze zrobic to z zagniezdzonym zapytaniem np.:

SELECT setval('galeriaplikidseq', (SELECT max(id) FROM galeriaplik));

Bezpieczniej o tyle ze jezeli ktos cos zmienil w miedzyczasie mamy gwarancje ustrzymania maxymalnego id.

A co do podbicia recznego id. Moze jakis modul z django probuje inaczej nadawac PK? Standardowy panel admina raczej nie powinien tutaj syfu narobic aczkolwiek moze cos sie pozmienialo w ostatnich wersjach ;)



Komentarze