django syncdb dan model yang diperbarui

86

Saya baru saja memperbarui model saya, menambahkan BooleanField padanya namun ketika saya melakukannya python manage.py syncdb, itu tidak menambahkan bidang baru ke database untuk model tersebut. Bagaimana cara memperbaikinya?

Hellnar
sumber
17
Fakta bahwa Django tidak mendukung hal mendasar seperti itu di luar kotak menahan saya dari menggunakannya untuk membuat model sama sekali. Fakta bahwa mereka mempertimbangkan sebuah ORM yang menangani pembuatan tabel tetapi bukan modifikasi tabel (di tempat) menjadi kualitas terbitan hampir membuat saya tidak menggunakan Django seluruhnya.
Glenn Maynard
3
Fakta bahwa Django mengizinkan kelengkapan aplikasi yang begitu hebat membuat Django mengagumkan, dan membuat kurangnya dukungan bawaan untuk modifikasi tabel pada dasarnya tidak relevan. Seberapa sulit menginstal aplikasi?
Dominic Rodger
@ Glenn, rencanakan model Anda dengan benar selama fase desain dan Anda tidak akan mengalami masalah ini. Jika Anda menambahkan fitur baru, gunakan rangkaian migrasi seperti Selatan. Migrasi di tempat seringkali rumit; jauh terlalu rumit untuk sebuah perintah manajemen Django sederhana.
Soviut

Jawaban:

100

Dari Django 1.7 dan seterusnya

Django telah membangun dukungan untuk migrasi - lihat dokumentasinya .

Untuk Django 1.6 dan sebelumnya

Django tidak mendukung migrasi di luar kotak. Ada sebuah aplikasi yang dapat dicolokkan untuk Django yang melakukan persis seperti itu, dan bekerja dengan baik. Ini disebut Selatan .

Dominic Rodger
sumber
1
Catatan: Saya memiliki masalah menggunakan Selatan untuk memigrasi model dengan backend db kustom (seperti django-mssql)
Jangan
1
Selatan sangat bagus! Terima kasih atas tipnya
Julien Greard
14

Django saat ini tidak melakukan ini secara otomatis. Pilihan Anda adalah:

  1. Lepaskan tabel dari database, lalu buat kembali dalam bentuk baru menggunakan syncdb.
  2. Cetak SQL untuk database menggunakan python manage.py sql (appname), temukan baris yang ditambahkan untuk bidang dan tambahkan secara manual menggunakan alter tableperintah SQL. (Ini juga akan memungkinkan Anda untuk memilih nilai bidang untuk catatan Anda saat ini.)
  3. Gunakan Selatan (sesuai jawaban Dominic ).
che
sumber
11

Ikuti langkah ini:

  1. Ekspor data Anda ke fixture menggunakan perintah manajemen dumpdata
  2. Jatuhkan meja
  3. Jalankan syncdb
  4. Muat ulang data Anda dari fixture menggunakan perintah manajemen loaddata
Soviut
sumber
Setetes dan muat ulang sepenuhnya untuk sesuatu yang harus dilakukan di tempat? Itu buruk.
Glenn Maynard
3
Ini adalah perintah manajemen yang sederhana, bukan rangkaian migrasi! Django tidak mempunyai cara untuk meramalkan bagaimana data anda telah berubah atau bagaimana menyimpannya sehingga ia bersikeras bahwa anda melakukannya sendiri. Jika Anda tidak menyukainya, gunakan alat migrasi seperti Selatan.
Soviut
8

Seperti yang disarankan dalam jawaban teratas, saya mencoba menggunakan Selatan , dan setelah satu jam frustrasi dengan kesalahan migrasi yang tidak jelas memutuskan untuk menggunakan Django Evolution sebagai gantinya.

Saya pikir lebih mudah untuk memulai daripada Selatan, dan ini bekerja dengan sempurna saat pertama kali saya mengetik ./manage.py evolve --hint --execute, jadi saya senang dengannya.

Dan Abramov
sumber
7
Setelah menggunakan Django Evolution dan South selama hampir setahun, saya mengubah opini saya. Selatan luar biasa. Tapi ini sangat mirip dengan Git dalam arti Anda harus memastikan Anda benar-benar memahami cara kerjanya . Jika Anda mengetik perintah secara membabi buta, kemungkinan besar Anda akan membuat kesalahan saat pertama kali Anda atau seseorang di tim Anda membuat kesalahan.
Dan Abramov
2

Saya pernah menggunakan django beberapa saat, tetapi saya ingat bahwa syncdb melakukan perintah alter pada tabel db. Anda harus melepaskan tabel lalu menjalankan lagi dan itu akan membuat lagi.

edit: maaf TIDAK melakukan perubahan.

Alex H.
sumber
Maka itu tidak menjalankan alter tableperintah, itu menjalankan create tableperintah.
Dominic Rodger
nah saya punya data di db jadi alangkah baiknya jika saya mengatasi masalah ini tanpa drop.
Hellnar
1
Saya pikir Anda ingin mengatakan, bahwa syncdb TIDAK melakukan perintah perubahan. Anda tidak perlu menghapus tabel, Anda juga dapat menambahkan kolom baru ke sql Anda secara manual.
Odif Yltsaeb
ya tapi pertanyaannya merujuk pada penggunaan syncdb, jadi dalam hal ini Anda harus melepaskan tabel untuk menggunakan syncdb atau menggunakan plugin yang disebutkan di bawah ini.
Alex H
1
Jika Anda frustrasi dengan Selatan, coba Django Evolution sebagai gantinya. Bekerja dengan baik untuk saya. stackoverflow.com/questions/1605662/…
Dan Abramov
1

Dalam django 1.6

  • Pada awalnya kami telah menjalankan - python manage.py sql <app name>

  • Lalu kita harus lari - python manage.py syncdb

Monwara Hossain Munni
sumber
0

Jika Anda menjalankan Django dengan Apache dan MySQL, restart apache setelah melakukan migrasi dengan makemigrations .

Felipe Perry
sumber