MySQL DBを使用してDjangoアプリを作成しています。初めて 'python manage.py migrate'を実行すると、いくつかのテーブルがうまく作成され、いくつかのエラーが表示されます。 :
Django.db.utils.IntegrityError:(1215、「外部キー制約を追加できません」)
このMySQLコマンドを実行すると-
エンジンINNODBステータスを表示\ G、
これを取得>>>
2015-02-17 14:33:17 7f10891cf700 Error in foreign key constraint of table movie_store/#sql-4f1_66:
FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`):
Cannot resolve table name close to:
(`id`)
完全なトレースバックは次のとおりです。
Creating tables...
Creating table users
Creating table merchant
Creating table celery_taskmeta
Creating table celery_tasksetmeta
Creating table djcelery_intervalschedule
Creating table djcelery_crontabschedule
Creating table djcelery_periodictasks
Creating table djcelery_periodictask
Creating table djcelery_workerstate
Creating table djcelery_taskstate
Creating table post_office_email
Creating table post_office_log
Creating table post_office_emailtemplate
Creating table post_office_attachment
Running deferred SQL...
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/Django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/Django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/Django/core/management/base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python2.7/dist-packages/Django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/dist-packages/Django/core/management/commands/migrate.py", line 173, in handle
created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
File "/usr/local/lib/python2.7/dist-packages/Django/core/management/commands/migrate.py", line 309, in sync_apps
cursor.execute(statement)
File "/usr/local/lib/python2.7/dist-packages/Django/db/backends/utils.py", line 80, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/Django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/Django/db/utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/local/lib/python2.7/dist-packages/Django/db/backends/utils.py", line 63, in execute
return self.cursor.execute(sql)
File "/usr/local/lib/python2.7/dist-packages/Django/db/backends/mysql/base.py", line 124, in execute
return self.cursor.execute(query, args)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
Django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')
これは動作します
python manage.py migrate auth
python manage.py migrate
この問題は、認証の前に他の移行が実行されるため、「authtools」の移行が最初に実行されるようになります
すべてのアプリの移行を作成しましたか?そうでない場合は、データベーステーブルが間違った順序で作成されているという問題に遭遇している可能性があり、このエラーが発生します。
既存のDjango 1.7プロジェクトがある場合、ここで説明するように、初期移行ファイルを作成し、初期移行を偽造する必要があります
https://docs.djangoproject.com/en/1.8/topics/migrations/#adding-migrations-to-apps
移行を作成します
$ python manage.py make migrations your_app_label
そして、アプリケーションを偽造します
$ python manage.py migrate --fake-initial your_app_label
使用中にこの問題に遭遇しました:
_$ python manage.py test
_
ForeignkeyからDjango.contribであるフィールドを持つモデルの移行を行わなかった場合。 auth.models.User、その問題が発生します。
_--keepdb
_を有効にした場合、_auth_user
_テーブルと他のDjangoのadminテーブルはありません。
問題全体をトレースしてみましょう。
実行:
_$ python manage.py test --verbosity=3
_
後に発生したforeigngkey制約の例外を確認できます。
遅延SQLを実行しています...
遅延SQLは次のようになります
「変更テーブル
xxx
制約の追加xx
外部キー(x
)参照__auth_user
_ "
Django/core/management/commands/migrate.py のソースコードを確認します。
_for statement in deferred_sql:
cursor.execute(statement)
_
_defered_sql
_はmanifest.items()
forループに由来し、
manifest
は_all_models
_から派生し、
_all_models
_は、app_labelsのapp_config.labelから取得されます。
これは、渡された引数です
_self.sync_apps(connection, executor.loader.unmigrated_apps)
_
したがって、_executor.loader.unmigrated_apps
_にはunmigrated_appのラベルが含まれ、Djangoのauth_userに対するForeignkeyがあった場合、その時点でForeignkey制約エラーの原因となり、auth_userという名前のテーブルはありません。
溶液:
app
がこれらのForeignkey属性クラスを含むモジュールであると仮定します:
_$ python manage.py migrate auth
$ python manage.py migrate
$ python manage.py makemigrations app
_
また、app
に依存する他のモジュールがある場合、データベーステーブルにapp
モジュールと同じフィールドがあると仮定すると、以下が必要です。
_$ python manage.py make migrate app --fake
_
外部キー「author_id」でも同じ問題が発生しました。
解決策は、名前を
author = models.ForeignKey(User, related_name='+')
に
writer = models.ForeignKey(User, related_name='+')
フィールドの名前を別のものに変更してみてください
group
BitBucket/PipelinesでCIをセットアップしようとしたときに同じエラーが発生しました。問題は、Pipelinesが毎回ゼロからすべてを再構築し、ユニットテストの開始に失敗したため、gitリポジトリに移行フォルダーをコミットしていなかったことです。
次を実行すると、移行フォルダーが作成されます。
python manage.py makemigrations
python manage.py makemigrations <module_name>
Makemigrations/migrateステップを実行し、テスト以外のコードが機能していることを確認した後、私のテストは機能します。
のようだ:
python manage.py test
現在存在しない場合は移行を生成しようとしますが、依存関係を常に正しく取得できるとは限らないため、移行フォルダー内の自動生成コードをソースコードリポジトリにコミットする必要があります。
Django移行の詳細については、こちらをご覧ください: https://docs.djangoproject.com/en/1.11/topics/migrations/
外部キーと主キーの両方が同じタイプであることを確認してください。
外部キーは、外部テーブルの主キーと同じタイプである必要があります。外部テーブルにbigintがあり、Djangoは、bigintである外部キーを自動的に作成する方法を知りませんでした。
python manage.py sqlmigrate {app_name} {migration_name}を実行して、移行が失敗した理由を調査しました
これをワークベンチで実行すると、障害の背後にある実際のエラーが表示されます。
Django.db.utils.IntegrityError:(1215、「外部キー制約を追加できません」)