Problème de migration Django mySQL
Bonjour,
Je ne sais pas trop quoi faire avec l'erreur quand je fais un migrate :
django.db.utils.OperationalError: (1050, "Table 'accounts_hero_stories_completed' already exists")
En développement j'ai du delete les table direct avec TablePlus pour y arriver (j'ai eu le cas avec ma sqlite).
Mais là en mode production je ne peux pas faire comme ça.
Savez-vous ce que je peux faire ?
Merci d'avance
PS : j'ai supprimé tous les fichiers de migrations que j'avais pour refaire un makemigrations et réduire le nombre de fichiers. Sinon j'avais un historique de fou avec tous les fichiers que j'avais... lol. Mais je n'ai jamais eu de problèmes je pense que ça se fait ?
```
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/gabigab117/webrpg/project/manage.py", line 22, in <module>
main()
File "/home/gabigab117/webrpg/project/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/core/management/init.py", line 442, in execute_from_command_line
utility.execute()
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/core/management/init.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/core/management/base.py", line 412, in run_from_argv
self.execute(args, **cmd_options)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/core/management/base.py", line 458, in execute
output = self.handle(args, options)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/core/management/base.py", line 106, in wrapper
res = handle_func(args, *kwargs)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/core/management/commands/migrate.py", line 356, in handle
post_migrate_state = executor.migrate(
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/migrations/executor.py", line 135, in migrate
state = self.migrate_all_forwards(
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/migrations/executor.py", line 167, in _migrate_all_forwards
state = self.apply_migration(
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/migrations/executor.py", line 252, in apply_migration
state = migration.apply(state, schema_editor)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/migrations/migration.py", line 132, in apply
operation.database_forwards(
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/migrations/operations/fields.py", line 108, in database_forwards
schema_editor.add_field(
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/backends/mysql/schema.py", line 107, in add_field
super().add_field(model, field)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/backends/base/schema.py", line 666, in add_field
return self.create_model(field.remote_field.through)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/backends/base/schema.py", line 451, in create_model
self.execute(sql, params or None)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/backends/base/schema.py", line 201, in execute
cursor.execute(sql, params)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/backends/utils.py", line 84, in _execute
with self.db.wrap_database_errors:
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/utils.py", line 91, in __exit_
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/backends/utils.py", line 87, in _execute
return self.cursor.execute(sql)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/django/db/backends/mysql/base.py", line 75, in execute
return self.cursor.execute(query, args)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/MySQLdb/cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/MySQLdb/cursors.py", line 330, in _query
db.query(q)
File "/home/gabigab117/webrpg/.venv/lib/python3.10/site-packages/MySQLdb/connections.py", line 255, in query
_mysql.connection.query(self, query)
django.db.utils.OperationalError: (1050, "Table 'accounts_hero_stories_completed' already exists")
```</module>
Salut Gab !
Les migrations c'est un point névralgique de ton application, il faut vraiment éviter (voir absolument !) de les supprimer.
C'est l'historique de tout ce qui se passe dans tes modèles, donc si tu modifies un petit truc ou que tu changes un fichier, ça risque de casser tout l'historique.
Dans ton cas tu as deux solutions "simples" :
-
Faire un faux migrate: Tu peux utiliser la commande
python manage.py migrate --fake <nom_de_ton_app>. Avec cette commande, tu vas faire croire à Django qu'il a appliqué les migrations sans rien faire vraiment en base de données (d'où le "fake"). -
Supprimer manuellement la migration problématique: Si le "fake migrate" ne marche pas, tu peux supprimer manuellement le fichier de migration qui pose problème et refaire tes migrations. Ça peut se faire mais là on rentre dans les solutions qui peuvent également produire d'autres problèmes, il faut savoir récupérer derrière si tu as une autre erreur.
En production c'est vraiment le truc qui est le plus à risque, si tu commences à avoir des divergences entre le modèle de ta base de données et tes migrations ça peut vraiment (j'insiste 😅) être compliqué de revenir à quelque chose de stable (et tu vas probablement devoir passer quelques nuits blanches les mains dans du SQL à te taper la tête contre les murs pour comprendre d'où viennent les erreurs).
Ooh je pensais qu'en supprimant les migrations et qu'en refaisant un make ça irait...
J'ai fait ça sur 3 de mes apps.. J'éviterai maintenant...
En plus je viens de faire mon fake mais j'ai oublié de mettre le nom de l'app après.
Du coup j'ai une erreur 500 quand je vais sur l'app....
Je suis dépité.
En gros je dois complètement supprimer la base de donnée ? et la refaire ?
En plus il y a les utilisateurs dedans, au pire ça va encore c'était une alpha. Mais pour récupérer mon histoire et tout je n'ai pas de save de tout ça :s
(.venv) 10:27 ~/webrpg/project (main)$ python manage.py migrate --fake
System check identified some issues:
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warning
s into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/4.2/ref/databases/#mysql-sql-mode
Operations to perform:
Apply all migrations: accounts, admin, auth, contenttypes, rpg, sessions, verify_email
Running migrations:
Applying accounts.0002_initial... FAKED
Applying rpg.0002_note... FAKED
(.venv) 10:27 ~/webrpg/project (main)$ python manage.py migrate
System check identified some issues:
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warning
s into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/4.2/ref/databases/#mysql-sql-mode
Operations to perform:
Apply all migrations: accounts, admin, auth, contenttypes, rpg, sessions, verify_email
Running migrations:
No migrations to apply.
(.venv) 10:27 ~/webrpg/project (main)$ python manage.py migrate
System check identified some issues:
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warning
s into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/4.2/ref/databases/#mysql-sql-mode
Operations to perform:
Apply all migrations: accounts, admin, auth, contenttypes, rpg, sessions, verify_email
Running migrations:
No migrations to apply.
EDIT : Voici ce que j'ai avec mon debug True. C'est le dernier modele que j'ai crée dans mon projet.

PS : repo au cas où https://github.com/gabigab117/webrpg.git
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte