Sudah ada pertanyaan serupa untuk Selatan, tetapi saya telah memulai proyek saya dengan Django 1.7 dan saya tidak menggunakan Selatan.
Selama pengembangan, banyak migrasi telah dibuat, namun perangkat lunak belum dikirim dan tidak ada database yang harus dimigrasi. Oleh karena itu saya ingin mengatur ulang migrasi seolah-olah model saya saat ini adalah yang asli dan membuat ulang semua database.
Apa cara yang disarankan untuk melakukan itu?
EDIT: Pada Django 1.8 ada perintah baru bernama squashmigrations yang kurang lebih memecahkan masalah yang dijelaskan di sini.
django
django-migrations
django-1.7
Kit Fisto
sumber
sumber
Jawaban:
Saya mengerti. Saya baru saja menemukan ini dan itu bagus.
Pertama, untuk menghapus tabel migrasi:
Hapus
app-name/migrations/
folder atau konten.Lakukan migrasi:
Terakhir, rapikan migrasi Anda tanpa membuat perubahan database lainnya:
sumber
zero
. Untuk sistem migrasi Django,<app-name>
sekarang menjadi aplikasi baru danmakemigrations <app-name>
akan dimulai dari0001
.--fake
mencegah tabel agar tidak benar-benar diubah, bahwa migrasi seharusnya hanya ditandai terbalik dan tidak benar-benar diterapkan ke skema. (Menambahkan penjelasan kecil demi kelengkapan, @ tani-rokk, @Fabrizio)manage.py migrate --fake <app-name> zero
untuk menghapus tabel migrasi, lalu hapus <app-name> / migrations / folder atau konten. Kemudianmanage.py makemigrations <app-name>
dan akhirnya lakukanmanage.py migrate --fake <app-name>
. Ini akan merapikan migrasi Anda tanpa membuat perubahan database lainnya.Dalam migrasi versi Django 1.7 fungsionalitas reset yang dulu di Selatan telah dihapus untuk mendukung fungsionalitas baru untuk 'menekan' migrasi Anda. Ini seharusnya menjadi cara yang baik untuk menjaga jumlah migrasi tetap terkendali.
https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations
Jika Anda masih ingin benar-benar memulai dari awal, saya berasumsi Anda masih bisa dengan mengosongkan tabel migrasi dan menghapus migrasi setelah itu Anda akan berjalan
makemigrations
lagi.sumber
raise KeyError("Migration %s dependencies reference nonexistent parent node %r" % (migration, parent))
./manage.py squashmigrations myapp 0004
akan menghentikan semua migrasi sebelum migrasi0004
di aplikasi Andamyapp
. Ini akan membuat satu migrasi terjepit.Saya baru saja mengalami masalah yang sama. Inilah solusi saya.
Itu
find
perintah: http://unixhelp.ed.ac.uk/CGI/man-cgi?findsumber
Dengan asumsi ini adalah struktur proyek Anda,
Anda dapat menjalankan skrip remove_migrations.py dari tempat yang ditunjukkan di atas untuk menghapus semua file migrasi.
Menghapus secara manual bisa melelahkan jika Anda memiliki proyek yang rumit. Ini menghemat banyak waktu saya. Menghapus file migrasi aman. Saya telah melakukan ini beberapa kali tanpa menghadapi masalah ... belum.
Namun ketika saya menghapus folder migrasi,
makemigrations
ataumigrate
tidak membuat folder kembali untuk saya. Skrip memastikan bahwa folder migrasi dengan foldernya__init__.py
tetap ada, hanya menghapus file migrasi.sumber
touch migrations/__init__.py
)DELETE FROM django_migrations Where app in ('app1', 'app2');
./manage.py makemigrations
./manage.py migrate --fake
ATAU, Anda dapat menulis migrasi dari semua ini
sumber
./manage.py makemigrations
agar berfungsi, seperti:./manage.py makemigrations orders alerts
Saya mencoba perintah yang berbeda dan beberapa jawaban membantu saya. Hanya urutan ini dalam kasus saya yang memperbaiki kedua dependensi yang rusak dalam migrasi di MYAPP dan membersihkan semua migrasi sebelumnya mulai dari awal.
Sebelum melakukan ini, pastikan bahwa database sudah disinkronkan (misalnya, jangan menambahkan bidang Model baru di sini atau mengubah opsi Meta).
Di mana 0002 adalah nomor migrasi yang dikembalikan oleh perintah makemigrations terakhir.
Sekarang Anda dapat menjalankan makemigrations / migrate lagi secara normal karena migrasi 0002 disimpan tetapi tidak tercermin dalam database yang sudah disinkronkan.
sumber
Jika Anda tidak peduli dengan migrasi sebelumnya, bagaimana dengan hanya menghapus semua migrasi di direktori migrations /? Anda akan memulai urutan migrasi dari awal, menggunakan model Anda saat ini sebagai referensi seolah-olah Anda telah menulis seluruh model sekarang.
Jika Anda tidak cukup mempercayai saya untuk menghapusnya, cobalah untuk menyingkirkannya.
sumber
Cara yang sederhana adalah
Buka setiap aplikasi dan hapus file migrasi.
Lalu pergi ke tabel django-migrtaions dalam database dan potong (hapus semua entri).
Setelah itu Anda dapat membuat migrasi sekali lagi.
sumber
cd ke direktori src
cd /path/to/src
hapus direktori migrasi
rm -rf your_app/migrations/
perhatikan bahwa ini harus dilakukan untuk setiap aplikasi secara terpisah
migrasi
python3.3 manage.py migrate
jika Anda ingin memulai lagi
python3.3 manage.py makemigrations your_app
sumber
Jika Anda dalam mode pengembangan dan Anda hanya ingin mengatur ulang semuanya (database, migrasi, dll), saya menggunakan skrip ini berdasarkan jawaban Abdelhamid Ba. Ini akan menghapus tabel database (Postgres), menghapus semua file migrasi, menjalankan kembali migrasi dan memuat perlengkapan awal saya:
reset-db.sql file:
file migrasi.sh:
file load_initial_fixtures.sh:
Pastikan untuk mengubah jalur yang sesuai dengan aplikasi Anda. Saya pribadi memiliki skrip ini dalam folder bernama project_root / script / local, dan sumber django ada di project_root / src.
sumber
Setelah menghapus setiap folder "migrasi" di aplikasi saya (secara manual), saya menjalankan:
Kemudian saya pikir saya bisa melakukannya
./manage.py makemigrations
untuk meregenerasi semuanya. Namun, tidak ada perubahan yang terdeteksi. Saya kemudian mencoba menentukan satu aplikasi dalam satu waktu:./manage.py makemigrations foo
,./manage.py makemigrations bar
. Namun, hal ini mengakibatkan ketergantungan melingkar yang tidak dapat diselesaikan.Akhirnya, saya menjalankan satu perintah makemigrations yang menentukan SEMUA aplikasi saya (tanpa urutan tertentu):
Kali ini, berhasil - dependensi melingkar diselesaikan secara otomatis (ini membuat file migrasi tambahan jika perlu).
Kemudian saya bisa lari
./manage.py migrate --fake
dan kembali berbisnis.sumber