Django error de MySQL al crear tablas

Estoy construyendo una aplicación django con una base de datos MySQL. Cuando ejecuto ‘python manage.py migrate’ por primera vez, algunas tablas se crean bien y luego aparecen algunos errores. El error que se saca es:

django.db.utils.IntegrityError: (1215, ‘No se puede agregar la restricción de clave externa’)

Cuando ejecuto este comando MySQL –

MOSTRAR ESTADO DEL MOTOR INNODB \ G,

Me sale esto >>>

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`) 

El rastreo completo es:

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

Esto funcionara

 python manage.py migrate auth python manage.py migrate 

El problema se debe a que otra migración se ejecuta antes de la autenticación, por lo que esto asegurará que la migración de “authtools” se ejecute primero

¿Has creado migraciones para todas tus aplicaciones? Si no es así, es posible que esté teniendo el problema de que las tablas de la base de datos se crean en el orden incorrecto, lo que le dará este error.

Si tiene un proyecto Django 1.7 existente, entonces necesita crear los archivos de migración iniciales y luego simular la migración inicial, como se describe aquí.

https://docs.djangoproject.com/en/1.8/topics/migrations/#adding-migrations-to-apps

Crea la migración con

 $ python manage.py make migrations your_app_label 

Y luego falsificar la aplicación.

 $ python manage.py migrate --fake-initial your_app_label 

Me encontré con este problema mientras uso:

 $ python manage.py test 

Si no realizó migraciones para esos modelos que tienen un campo que es una clave de acceso foráneo para django.contrib.auth.models.User , causará ese problema.

Y si habilitas --keepdb , encontrarás que no hay auth_user tabla auth_user y alguna otra tabla de administración de django.


Vamos a rastrear todo el problema:

correr:

 $ python manage.py test --verbosity=3 

Puedes ver la excepción de la restricción de la clave foránea extraída después de

Ejecutando SQL diferido …

el sql diferido es similar a

“ALTERAR MESA xxx AGREGAR RESTRICCIÓN xx TECLA EXTRANJERA ( x ) REFERENCIAS auth_user

verifique el código fuente de django / core / management / commands / migrate.py :

 for statement in deferred_sql: cursor.execute(statement) 

El defered_sql proviene de manifest.items() para loop,

y el manifest viene de all_models ,

y all_models proviene de app_config.label en app_labels .

este es el argumento pasado

 self.sync_apps(connection, executor.loader.unmigrated_apps) 

Por lo tanto, executor.loader.unmigrated_apps contendrá la etiqueta unmigrated_app, y si tiene que tener una Foreignkey para el auth_user de Django, esto causará que Foreignkey restrinja la causa del Error en ese momento, no hay una tabla llamada auth_user.


solución:

Supongamos que la app es el módulo que contiene la clase de atributos de Foreignkey:

 $ python manage.py migrate auth $ python manage.py migrate $ python manage.py makemigrations app 

y, si tiene otros módulos que dependen de la app , suponga que las tablas de la base de datos tienen el mismo campo que el módulo de la app , necesita:

 $ python manage.py make migrate app --fake 

Tuve el mismo problema con la clave foránea ‘author_id’.

La solución fue cambiar el nombre de

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

a

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

así que intenta cambiar tu nombre del campo a algo diferente a

 group 

Tuve el mismo error al intentar configurar CI en BitBucket / Pipelines. El problema era que no había enviado la carpeta de migraciones a nuestro repository de git, ya que Pipelines reconstruye todo desde cero cada vez, las pruebas de la unidad no se podían iniciar.

La carpeta de migraciones se crea cuando ejecutas:

 python manage.py makemigrations python manage.py makemigrations  

Mis pruebas funcionarán después de ejecutar los pasos makemigrations / migrate y asegurar que nuestro código no de prueba funcionara.

Parece que:

 python manage.py test 

intentará generar las migraciones, si no existen actualmente, pero no siempre puede obtener las dependencias correctas, por lo tanto, debe asegurarse de confirmar el código generado automáticamente en la carpeta de migraciones a su repository de código fuente.

Puede encontrar más detalles sobre las migraciones de django aquí: https://docs.djangoproject.com/en/1.11/topics/migrations/

Asegúrese de que tanto la clave externa como la primaria sean del mismo tipo.

La clave externa debe ser del mismo tipo que la clave principal de la tabla externa. Tenía un bigint en la tabla externa y django no sabía cómo crear una clave externa que fuera un bigint automáticamente.

Se investigó por qué fallaba la migración al ejecutar: python manage.py sqlmigrate {app_name} {migration_name}

Ejecute esto en el entorno de trabajo y verá el error real detrás de la falla.

django.db.utils.IntegrityError: (1215, ‘No se puede agregar la restricción de clave externa’)

Tuvo el mismo problema, resultó que, de alguna manera, Django se actualizó a v1.8 y luego bajó a v1.7 .

En Django 1.8, se ha eliminado el comando syncdb, en lugar del comando syncdb try manage.py migrate, se crearán las tablas. después de eso, debe crear el comando de creación de superusuario de superusuario o ejecutar manage.py syncdb. Funcionará.

Si lo anterior no funciona y no necesita Innodb, la configuración predeterminada de MYISAM funciona ya que no tiene el mismo nivel de integridad referencial:

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'name', 'USER': 'user', 'PASSWORD': 'password', 'OPTIONS': { "init_command": "SET storage_engine=MYISAM", } } }