web-dev-qa-db-ja.com

Djangoテーブル作成時のMySQLエラー

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')
34
Denny

これは動作します

python manage.py migrate auth
python manage.py migrate

この問題は、認証の前に他の移行が実行されるため、「authtools」の移行が最初に実行されるようになります

33
hiennt

すべてのアプリの移行を作成しましたか?そうでない場合は、データベーステーブルが間違った順序で作成されているという問題に遭遇している可能性があり、このエラーが発生します。

既存の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
9
Rachel

使用中にこの問題に遭遇しました:

_$ 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
_
7
carton.swing

外部キー「author_id」でも同じ問題が発生しました。

解決策は、名前を

author = models.ForeignKey(User, related_name='+')

writer = models.ForeignKey(User, related_name='+')

フィールドの名前を別のものに変更してみてください

group
4
Tobit

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/

2
Lingster

外部キーと主キーの両方が同じタイプであることを確認してください。

外部キーは、外部テーブルの主キーと同じタイプである必要があります。外部テーブルにbigintがあり、Djangoは、bigintである外部キーを自動的に作成する方法を知りませんでした。

python manage.py sqlmigrate {app_name} {migration_name}を実行して、移行が失敗した理由を調査しました

これをワークベンチで実行すると、障害の背後にある実際のエラーが表示されます。

Django.db.utils.IntegrityError:(1215、「外部キー制約を追加できません」)

1
Gil Margolin