質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

4475閲覧

Django:テーブルを削除した後にmigrateしてもテーブルが作成されない

save6

総合スコア5

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

0クリップ

投稿2021/10/14 03:13

Djangoでmigrateしてもカラムが作られない状態だったので、試しにmysql上でdropコマンドで直接テーブルを削除しました。

そして、migarationsフォルダ内の_init_.py以外のマイグレーションファイルを削除してmakemigrationsし直して、migrateしました。

そうしたら「No migrations to apply.」と表示されmigrateされません。
確認しましたが削除したテーブルは作成されていませんでした。

実行したマイグレーションファイルには下記のようにCreateModelで作成したいテーブルの情報が入っている状態です。

migrations.CreateModel( name='Village_request', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('status', models.IntegerField(default=0)), ('updated_date', models.DateTimeField(auto_now=True)), ('creation_date', models.DateTimeField(auto_now_add=True)), ('request_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='request_user_id', to=settings.AUTH_USER_MODEL, verbose_name='request_user_id')), ('village_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='request_village_id', to='Village_app.Village', verbose_name='village_id')), ], ),

削除したテーブルを作り直すにはどうすればよろしいでしょうか?
調べたのですが分からず申し訳ございませんが、ご回答いただけますと幸いです。

出来ましたらテストデータを消したくないためデータベースの作り直し以外の方法ですと助かります(それしか方法がない場合は実行しますが避けたいです)。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そうしたら「No migrations to apply.」と表示されmigrateされません。

Djangoにはマイグレーション管理用のモデルが存在しており、マイグレーション対象の以下の情報をそのモデル (≒テーブル)で管理しています。

  • マイグレーション対象のアプリケーション名
  • 上記アプリケーション配下のマイグレーションモジュール(ファイル)名
  • マイグレーションを適用したタイミング

そのため、一度適用したマイグレーションの元ファイルを削除→再作成を実施しても、
「マイグレーションしたこと」の履歴が消えたわけではないので、マイグレーションしようとしても何も起きません。
(結果としてマイグレーションモジュール名が変わった場合は別かもしれません)

削除したテーブルを作り直すにはどうすればよろしいでしょうか?

migrateコマンドで「特定のマイグレーション地点まで戻す」ことが出来るようなので、
本来はこれを利用して一度戻した上で新しいマイグレーションを適用し直すのが本来の手法かとは思います。
https://docs.djangoproject.com/en/3.2/topics/migrations/#reversing-migrations

ただ、マイグレーション地点を戻すためにDROP TABLEを呼ぶ可能性を考えると、テーブルが削除済みなために失敗しそうな気がします。

※以下、無保証

マイグレーション内容が「モデルのためのテーブル作成」しかしていない(既存テーブルへのカラム追加などをしていない)のであれば、
mysql経由でマイグレーション管理用のテーブルを直接編集して対処することは可能だとは思います。
(もちろん、事前のバックアップを強く推奨します)

マイグレーション管理用のテーブルが見つかるはずなので、そのレコードから今回適用したいマイグレーションとバッティングしている名前のレコードを探して削除すれば、マイグレーション処理上は「未適用」とみなされてマイグレーションが可能になると思います。

投稿2021/10/16 04:50

attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

save6

2021/10/18 05:56

ご回答いただき誠にありがとうございます。 詳しい解説をしていただき理解が深まりました。 migrateコマンドで戻してみたのですが、attakei様の予想通りテーブルがないためエラーになり、再作成はできませんでした。 マイグレーション管理用のテーブル(私の環境では「django_migrations」という名前でした)で該当するレコードを削除した後、マイグレーションし直したら無事再作成されました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問