Saya ingin menghapus null = True dari TextField:
- footer=models.TextField(null=True, blank=True)
+ footer=models.TextField(blank=True, default='')
Saya membuat migrasi skema:
manage.py schemamigration fooapp --auto
Karena beberapa kolom footer berisi, NULL
saya mendapatkan ini error
jika saya menjalankan migrasi:
django.db.utils.IntegrityError: kolom "footer" berisi nilai null
Saya menambahkan ini ke migrasi skema:
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
Sekarang saya mendapatkan:
django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events
Apa yang salah?
python
django
postgresql
django-migrations
guettli
sumber
sumber
Jawaban:
Alasan lain untuk ini mungkin karena Anda mencoba untuk mengatur kolom
NOT NULL
ketika sebenarnya sudah memilikiNULL
nilai.sumber
Setiap migrasi ada di dalam transaksi. Di PostgreSQL Anda tidak boleh memperbarui tabel dan kemudian mengubah skema tabel dalam satu transaksi.
Anda perlu memisahkan migrasi data dan migrasi skema. Pertama buat migrasi data dengan kode ini:
Kemudian buat migrasi skema:
Sekarang Anda memiliki dua transaksi dan migrasi dalam dua langkah seharusnya berfungsi.
sumber
Baru saja mengalami masalah ini. Anda juga dapat menggunakan db.start_transaction () dan db.commit_transaction () dalam migrasi skema untuk memisahkan perubahan data dari perubahan skema. Mungkin tidak begitu bersih untuk memiliki migrasi data terpisah tetapi dalam kasus saya, saya memerlukan skema, data, dan kemudian migrasi skema lain jadi saya memutuskan untuk melakukan semuanya sekaligus.
sumber
Pada operasi saya meletakkan BATAS SET:
sumber
Anda mengubah skema kolom. Kolom footer tersebut tidak lagi berisi nilai kosong. Ada kemungkinan besar nilai kosong sudah disimpan di DB untuk kolom itu. Django akan memperbarui baris kosong itu dalam DB Anda dari kosong ke nilai default sekarang dengan perintah migrate. Django mencoba memutakhirkan baris di mana kolom footer mempunyai nilai kosong dan mengubah skema pada saat yang sama kelihatannya (saya tidak yakin).
Masalahnya adalah Anda tidak dapat mengubah skema kolom yang sama dengan yang Anda coba perbarui nilainya pada saat yang sama.
Salah satu solusinya adalah menghapus file migrasi yang memperbarui skema. Kemudian, jalankan skrip untuk memperbarui semua nilai tersebut ke nilai default Anda. Kemudian jalankan kembali migrasi untuk memperbarui skema. Dengan cara ini, pembaruan sudah selesai. Migrasi Django hanya mengubah skema.
sumber