2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Djangoでmigrationsができないときの解決策

Last updated at Posted at 2021-03-05

前提

Djangoを使っていると、DBに変更を反映するため
python manage.py makemigrations
python manage.py migrate
が必要になります。

そんなとき、python manage.py makemigrationsはできたけど
DBにマイグレーションができない!!!
なんてことがあるのではないかと思います。

そんな時の解決策

#状況
Herokuを使っていた時のこと。
まずは、gitを使ってherokuにpushしました。
git push heroku master
ここまでは、成功

続いて、localではmigrationができたのでHerokuでも同じように実施しようとしました。
(herokuでは(makemigrtationsを行った際に生成される)migration ファイルは既にherokuに送られているため)

しかし、はじかれてしまう。
僕の場合は、ターミナル(コマンドプロンプト上で)
ValuEerror: invalid literal for int() with base 10: ''”
もしくは、サイトにアクセスして新規のmodelにアクセスしようするときは、
relation "****" does not exist LINE 1: SELECT COUNT(*) AS "__count" FROM "Atlus_predicts"
が出てきました。

DBはpostgreSQLです。

んで、どうすればいいかわからずdbをリセットしてしまう方もいましたが、今回は諸事情によりそれは絶対にできない。。

#対処方法

migrationは、各アプリごとに管理されています。
まずどこまでがすでにmigrateされているのか明確にしましょう

コマンドとしては、

python manage.py showmigrations

(heroku上のファイル操作であれば、heroku runは先頭につける必要がある。)
そうすると

 [X] 0001_initial
 [X] 0002_introduction_privacy
 [X] 0003_introduction_privacy
 [X] 0004_statement

こんな感じのが表示されると思います。

この時、[X]がついてる場所はマイグレーションができています。
どこかでエラーが出ているのか、まず明確にしましょう。

んで、例えば

 [X] 0001_initial
 [X] 0002_introduction_privacy
 [] 0003_introduction_privacy
 [] 0004_statement

0003_introduction_privacyが原因だとしましょう。

そうしたら、僕は、まず0001_initialにマイグレーションをした状態に戻したいと思います。

コマンドとしては、

python manage.py migrate <アプリケーション名> 0001_initial
```

です。そして改めて``python manage.py showmigrations``をします。
そうすると

```
 [X] 0001_initial
 [] 0002_introduction_privacy
 [] 0003_introduction_privacy
 [] 0004_statement
```

マイグレーションが戻されることが確認できました。(ロールバックと言うそうです。)

んで、原因は``0003_introduction_privacy``でした。
一度、**それに対応するマイグレーションファイルと.pycファイルを削除しました。**
ここでは、``0002_introduction_privacy``から``0004_statement``まで全部削除しました。

そうして、もう一度

```
python manage.py makemigrations
```
からの

```
python manage.py migrate
```
後は、これをコミットしてheroku上でマイグレーションするだけです。


#おさらい
コマンドベースでおさらいします。

```
python manage.py showmigrations #エラーファイルを明確化
python manage.py migrate <アプリケーション名> <マイグレーションファイル名> #マイグレーションファイルをロールバック
*******   関係するマイグレーションファイルを削除(マイグレーションファイルを適用していないファイル)  *******
python manage.py makemigrations #改めてマイグレーションファイルを作成
python manage.py migrate #今度こそマイグレーションさせる
```


#原因
なぜ、このようなことが起こりこの手の手法でよくなったのかは正直わかりません。
しかし、こまめにmigrateしたりしているうちに依存関係に問題が出たりしたのではないかと考えています。
一度、問題が出る直前まで戻りこまめに変更していたマイグレーションファイルを一気通貫で行うことで修正できたのかな?
ex.
変更①->変更②->変更③
から
変更①->変更③
(実質的に②はいらないし、エラーの原因だから?)

的なイメージ??








2
2
0

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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?