migrate 実行時の SQL エラー(MySQL)対処方法

makemigrations は、モデルに対して行った変更をもとに新しいマイグレーションを作成します
migrate は、マイグレーションを適用したり適用をキャンセルするのに使います

makemigrations は、正常に生成できるが migrate で SQL エラーが発生する場合の対処方法です

結論から申しますと MySQL での error 確認する方法です

$ python manage.py makemigrations
~
Migrations for 'myapp':
  myapp/migrations/0001_initial.py
    - Create model StateMst
    - Create model User
~

$ python manage.py migrate --fake-initial
~
Operations to perform:
  Apply all migrations: admin, auth, myapp, contenttypes, sessions
Running migrations:
  Applying myapp.0002_auto_20200714_1234...Traceback (most recent call last):
~
MySQLdb._exceptions.OperationalError: (1005, "Can't create table 'myapp_dev.#sql-789_34a8' (errno: 150)")
~

このエラーメッセージだけだと具体的に何の原因かわからない
なので MySQL で詳細エラーを確認する

# dbshell の起動
$ python manage.py dbshell
~
MariaDB [***]> show engine innodb status;
~
------------------------
LATEST FOREIGN KEY ERROR
------------------------
200714 00:00:00 Error in foreign key constraint of table `myapp_dev`.`order_information`:
Alter  table `myapp_dev`.`order_information` with foreign key constraint failed. Referenced table `myapp_dev`.`view_payment_methods` not found in the data dictionary near ' FOREIGN KEY (`order_information_payment_method_id`) REFERENCES `view_payment_methods` (`id`)'.
~

この例では、外部キー制約の違反が発生した模様で model を確認し対処する


追記:MySQL の view に対して外部キー参照する場合、Django Model field の on_delete は、DO_NOTHING に設定する
SET_NULL だと何故か?上記のエラーが発生する?

Was this helpful?

0 / 0

コメントを残す 0

Your email address will not be published.