class Quiz(models.Model):
question_text = models.CharField(max_length=200)
class Meta:
managed = True
app_label = 'quiz'
db_table = 'preexist'
python3 manage.py makemigrations quiz
接著執行:
python3 manage.py migrate quiz
結果報錯:
django.db.utils.ProgrammingError: relation "preexist" already exists
如果直接跑runserver,結果會出現:
You have 1 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): quiz.
Run 'python manage.py migrate' to apply them.
改用fake再跑runserver就沒有跑出上面的問題了,就可以繼續進行專案。
python3 manage.py migrate --fake quiz
假設中途想改用另外的資料庫,欄位跟現在的資料庫不相同,資料模型就必須修改。
資料庫設定跟資料模型修改好,執行基本步驟後,跟上個情況報一樣的錯:
django.db.utils.ProgrammingError: relation "quiz_question" already exists
同樣跑fake後執行runserver沒問題。
python3 manage.py migrate --fake quiz zero
結果跑出:
Operations to perform:
Unapply all migrations: quiz
Running migrations:
Rendering model states... DONE
Unapplying animal.0001_initial... FAKED
2.接著就可以手動刪除migrations底下的檔案,除了__init__.py。
3.重新建立資料紀錄檔:
python3 manage.py makemigrations quiz
結果:
Migrations for 'quiz':
quiz/migrations/0001_initial.py
- Create model Choice
python3 manage.py migrate --fake-initial quiz
結果:
Operations to perform:
Apply all migrations: quiz
Running migrations:
Applying animal.0001_initial... FAKED
這樣就不會動到現有的資料又可以更改資料庫模型了!
就今天試做的感覺,兩者在這兩種情況都可以解決報錯的問題,差別在於initial的方法,讓我們可以刪除多餘的migrations紀錄,畢竟整個資料庫都重置,先前的紀錄檔案也沒有留下的必要。