แก้ Django Migration : pkey errors

คือมันปวดหัวฮะ

เวลาที่เราทำงานพร้อมกันหลายแบรนช์แล้วพวกก็จะแก้ Models พร้อม ๆ กัน
ทีแรก database เราก็อยู่สบายดี แต่พอสลับไปสลับมา ระหว่าง branch ทั้งหลายทั้งปวง พอทำ Migration ก็ชักจะเละเทะไปกันใหญ่

ณ จุดนึง พอรัน python manage.py migrate ปุ๊บก็จะได้ เออเร่อ ซีรีย์ Django Migration : pkey errors ขึ้นมา

มันจะประมาณ
“django_migrations _pkey” DETAIL: Key (id)=( ) already exists

ถ้าเป็นดาต้าเบสค่ายพี่ช้าง PostgreSQL ก็จะได้ errors จาก db แบบนี้

django.db.utils.IntegrityError: duplicate key value violates unique constraint “django_migrations_pkey”
DETAIL: Key (id)=(567อะไรว่าไป ) already exists.

ซึ่ง “django_migrations” เป็น table ที่ Django จะเก็บ log ไว้ว่า run migration อะไรไปแล้วบ้าง เมื่อไหร่
มาดูซิ มันเป็นยังไง

Tables แคปมาจาก PostgreSQL น่ะ

จากรูปด้านล่าง เทเบิ้ล Django migrations จะเก็บ ว่า migrate schema ของ app อะไร ชื่อ migration script ชื่ออะไร และรัน ./manage.py migration ไปเมื่อไหร่

fields ใน django_migrations table (แคป จาก PostgreSQL)

แต่บางที Sequence มันไม่ update ( ซีเคว้น คือคนที่เก็บว่า ตอนนี้ primary key ที่รันเลขอัตโนมัตินั้นรันไปถึงเลขอะไรแล้ว)
เช่น ตอนนี้ django_migrations รัน id ไปถึง 395 แล้ว แต่ Sequence ยังเก็บไว้ที่ 391 อยู่ มันจะ เออเร่อ แบบด้านบน

วิธีแก้ ก็ง่ายๆ มีแบบขวานผ่าซาก กับแบบที่ดูชั้นเชิงสักหน่อย

แบบที่มีชั้นเชิงก่อนนะ
Update Sequence ฮะ Update ให้มันถูกต้องตามที่ควรจะเป็น
ไปรัน SQL command ที่ PostgreSQL

โค้ด สำหรับ update sequence ไปรันที่ database นะจ๊ะ

แบบขวานผ่าซากคือ ถ้ามันบ่น pkey already exists
you ก็เพียงรันซ้ำ มันจะค่อย ๆ update Sequence ให้
สังเกตดู ตอนมัน error เลข pkey มันจะค่อยเพิ่ม จาก DETAIL: Key (id)=(ตะกี้391) already exists.
พอรันซ้ำ มันก็เป็น 392
รันซ้ำซากไป จนมัน Update ถึงจุดที่ถูกต้องอ่ะ — ขี้เกียจมั้ยล่ะ

พอแก้ django_migrations pkey ได้ ก็อาจจะมี ชาวแก๊งที่เกี่ยวข้อง มาเออเร่อ อีก คือ คุณ `django_content_type_pkey` และ `auth_permission_pkey`
สองคนนี้มักจะมาด้วยกันเวลาเราสร้าง Model ใหม่

django.db.utils.IntegrityError: duplicate key value violates unique constraint “django_content_type_pkey”
DETAIL: Key (id)=( ) already exists.

django.db.utils.IntegrityError: duplicate key value violates unique constraint “auth_permission_pkey”
DETAIL: Key (id)=( ) already exists

วิธีแก้ sequence ก็เหมือนกันนั่นล่ะจ้ะ
ถ้าไม่สงสัยอะไรแล้ว เท่านี้นะจ๊ะ บร๊ายบราย

--

--