Saya mencoba memulai dengan Selatan. Saya memiliki database yang sudah ada dan saya menambahkan Selatan ( syncdb
, schemamigration --initial
).
Kemudian, saya memperbarui models.py
untuk menambahkan bidang dan berlari ./manage.py schemamigration myapp --auto
. Tampaknya menemukan lapangan dan berkata saya bisa menerapkan ini dengan ./manage.py migrate myapp
. Tetapi, melakukan itu memberi kesalahan:
django.db.utils.DatabaseError: table "myapp_tablename" already exists
tablename
adalah tabel pertama yang terdaftar di models.py
.
Saya menjalankan Django 1.2, South 0.7
django
django-south
Steve
sumber
sumber
schemamigration
sebelummigrate
kita harus melakukan modifikasi sebelum yang terakhirschemamigration
.Punya masalah yang sama persis!
1. Pertama-tama periksa nomor migrasi yang menyebabkan ini. Mari kita asumsikan: 0010.
2. Anda perlu:
jika ada lebih dari satu bidang yang hilang Anda harus mengulanginya untuk setiap bidang.
3.Sekarang kamu mendarat dengan sekelompok migrasi baru jadi hapus file-file mereka dari myapp / migrasi (0011 dan selanjutnya jika kamu perlu menambahkan banyak bidang).
4.Jalankan ini:
Sekarang coba ./manage.py migrasi aplikasi saya
Jika tidak gagal, Anda siap. Cukup centang dua kali jika ada bidang yang tidak hilang.
EDIT:
Masalah ini juga dapat terjadi ketika Anda memiliki basis data produksi tempat Anda menginstal Selatan dan migrasi awal pertama yang dibuat dalam duplikat lingkungan lain apa yang sudah Anda miliki di db. Solusinya jauh lebih mudah di sini:
Palsu migrasi pertama:
./Manage melakukan migrasi myapp 0001 --palsu
Gulung dengan sisa migrasi:
./Mengelola migrasi aplikasi saya
sumber
Ketika saya mengalami kesalahan ini, ada penyebab lain.
Dalam kasus saya Selatan entah bagaimana meninggalkan dalam DB saya tabel kosong sementara, yang digunakan dalam _remake_table () . Mungkin saya telah membatalkan migrasi dengan cara yang seharusnya tidak saya lakukan. Bagaimanapun, setiap migrasi baru berikutnya, ketika disebut _remake_table (), melempar kesalahan
sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists
, karena memang sudah ada dan tidak seharusnya ada di sana.Bit _south_new tampak aneh bagi saya, jadi saya melihat-lihat DB saya, melihat meja
_south_new_myapp_mymodel
, menggaruk kepala saya, melihat sumber Selatan , memutuskan itu sampah, menjatuhkan meja, dan semuanya baik-baik saja.sumber
Jika Anda memiliki masalah dengan model Anda yang tidak cocok dengan basis data Anda, seperti @pielgrzym, dan Anda ingin memigrasi basis data secara otomatis agar sesuai dengan file models.py terbaru (dan menghapus data apa pun yang tidak akan dibuat kembali dengan perlengkapan selama
migrate
):Ini hanya akan menghapus dan membuat ulang tabel database yang ada di
models.py
file terbaru Anda , sehingga Anda mungkin memiliki tabel sampah di database Anda dari sebelumnyasyncdb
s ataumigrate
s. Untuk menghilangkannya, awali semua migrasi ini dengan:Dan jika itu masih menyisakan beberapa CRUFT tergeletak di database Anda maka Anda harus melakukan
inspectdb
dan membuatmodels.py
file dari itu (untuk tabel dan aplikasi yang ingin Anda hapus) sebelum melakukansqlclear
dan kemudian mengembalikan models.py asli Anda sebelum membuat--initial
migrasi dan bermigrasi ke sana. Semua ini untuk menghindari bermain-main dengan rasa khusus SQL yang dibutuhkan database Anda.sumber
Perform these steps in order may help you
:1) python manage.py schemamigration apps.appname --initial
Langkah di atas membuat folder migrasi sebagai default.
2) python manage.py migrasi apps.appname --fake
menghasilkan migrasi palsu.
3) python manage.py schemamigration apps.appname --auto
Kemudian Anda dapat menambahkan bidang seperti yang Anda inginkan dan melakukan perintah di atas.
4) python manage.py melakukan migrasi apps.appname
sumber
Jika Anda memiliki database dan aplikasi yang sudah ada, Anda dapat menggunakan perintah konversi selatan
Ini harus diterapkan sebelum Anda melakukan perubahan apa pun yang sudah ada dalam database.
Perintah convert_to_south hanya berfungsi sepenuhnya pada mesin pertama Anda menjalankannya. Setelah Anda melakukan migrasi awal yang dibuatnya ke dalam VCS Anda, Anda harus menjalankan
./manage.py migrate myapp 0001 --fake
pada setiap mesin yang memiliki salinan basis kode (pastikan terlebih dahulu mereka memiliki model dan skema). ref: http://south.readthedocs.org/en/latest/convertinganapp.htmlsumber
Sebagai solusi sementara, Anda dapat mengomentari pembuatan Tabel di skrip migrasi.
Atau
Jika tabel yang ada tidak mengandung baris (kosong), maka pertimbangkan untuk menghapus tabel seperti di bawah ini. (Perbaikan ini disarankan hanya jika tabel tidak berisi baris) . Pastikan juga operasi ini sebelum operasi createModel.
sumber
Satu lagi solusi (mungkin solusi sementara).
misalnya.,.
Ini akan mencantumkan semua migrasi dalam kueri sql mentah. Anda bisa memilih kueri yang ingin Anda jalankan menghindari bagian yang membuat tabel yang ada
sumber