26
23

More than 3 years have passed since last update.

[Django]migrateをやり直す

Posted at

[Django]migrateをやり直す

Django初学者のメモになります。
DB構築をする際にModelを書き直し、migrateをやり直りたい時があったのですが、いろいろとエラーしたりと苦労したので解決策を備忘録します。

[環境]
Django 2.01
python 3.7.2

想定

  • app名「recipe」を作成
  • userモデルをカスタマイズしたuserモデルへ変更※
  • migrateをやり直したい

※1.いろいろとtipsを覗いたが、カスタマイズUserにする際には、一度migrateをやり直した方が早いと思った。
なので、アプリケーションを作成する際には、最初にカスタマイズUserを作成するべき。

※2.ちなみにカスタマイズuserモデルの作成方法は以下の記事参照
ジャンゴ(django)のカスタムユーザーモデル(Custom User Model)

やり直し手順

「migrateをやり直したい」ここの手順を下記に記載する。

1.過去のmigrate履歴を確認

# 過去のmigrate履歴が見れる
>python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
recipe
 [X] 0001_initial
sessions
 [X] 0001_initial

結果は上記の通りで[]にxがついているのがmigrteが適応されている履歴になる。
recipeにも[x]がついているので適応済と判断できる。

2.テーブルを全て削除

接続先のDBの中の、過去にmigrateして生成したテーブルを全て削除(drop)する。

3.appのmigrationsフォルダの中身を削除

[app名].migrationsのフォルダ中身を全て削除
(今回の場合は、recipe.migrations)

4. migrate履歴の削除

以下の--fakeオプションのついたコマンドで履歴を削除する。
(カスタマイズUserを適応するやり直しの際には、全て削除しなければ解決しなかったので、adminからsectionsまですべて削除した。)

>python3 manage.py migrate --fake [削除対象] zero

#例:これでrecipeの履歴が削除される
#>python3 manage.py migrate --fake recipe zero

履歴が削除されたかを1と同様のコマンドで確認

admin
 [ ] 0001_initial
 [ ] 0002_logentry_remove_auto_add
 [ ] 0003_logentry_add_action_flag_choices
auth
 [ ] 0001_initial
 [ ] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002
 [ ] 0007_alter_validators_add_error_messages
 [ ] 0008_alter_user_username_max_length
 [ ] 0009_alter_user_last_name_max_length
 [ ] 0010_alter_group_name_max_length
 [ ] 0011_update_proxy_permissions
contenttypes
 [ ] 0001_initial
 [ ] 0002_remove_content_type_name
recipe
 [ ] 0001_initial
sessions
 [ ] 0001_initial

すべての履歴が削除されていることを確認。

5.appのmigrationファイルを生成

いつもの通りmigrationファイル生成

>python manage.py makemigrations [app名]

6.migrateを実行

いつもの通りmigrateを実行

>python manage.py migrate

これでDBを確認し、テーブルが生成されていることを確認する。

以上になります。
間違いなどありましたら、ご指摘をお願いいたします。

参考

Django マイグレーション まとめ
manage.py migrateをおかしな感じにやってしまった。

26
23
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
23