59 votes

Comment supprimer une table de SQLite3 dans DJango ?

J'ai créé un modèle, et j'ai exécuté python manage.py syncdb. Je pense que cela a créé une table dans la base de données. Puis j'ai réalisé que j'avais créé une colonne de manière incorrecte, alors je l'ai modifiée, et j'ai exécuté la même commande, en pensant qu'elle allait supprimer l'ancienne table et en ajouter une nouvelle.

Ensuite, je suis allé dans le shell python manage.py, et j'ai essayé d'exécuter .objects.all(), et cela a échoué, disant que la colonne n'existe pas.

Je veux effacer l'ancienne table, puis relancer syncdb, mais je n'arrive pas à trouver comment faire.

1 votes

C'est à dessein. Synchroniser les alters et les drops ouvrirait une boîte de Pandore géante. George a la bonne réponse pour vous.

72voto

Adrián Deccico Points 885

pour effacer une demande est aussi simple que d'écrire :

./manage.py sqlclear app_name | ./manage.py dbshell 

puis pour reconstruire vos tables, tapez simplement :

./manage.py syncdb

0 votes

J'ai enfin trouvé la solution. Merci

12 votes

Ne fonctionne plus dans Django 1.9+ : Dépréciations dans Django 1.9

47voto

iamio Points 81

Aucune des réponses ne montre comment supprimer une seule table dans une application. Ce n'est pas trop difficile. Le site dbshell permet à l'utilisateur de se connecter au shell sqlite3.

python manage.py dbshell

Lorsque vous êtes dans le shell, tapez la commande suivante pour voir la structure de votre base de données. Cela vous montrera tous les noms de tables de la base de données (ainsi que les noms de colonnes dans les tables).

SELECT * FROM sqlite_master WHERE type='table';

En général, Django nomme les tables selon la convention suivante : " nom_modèle ". Par conséquent, la requête SQL qui permet d'atteindre votre objectif ressemblera à ce qui suit :

DROP TABLE appname_modelname;

Cela devrait être suffisant, même si la table a des relations avec d'autres tables. Maintenant, vous pouvez vous déconnecter du shell SQLITE en exécutant :

.exit

Si vous exécutez à nouveau syncdb, Django reconstruira la table en fonction de votre modèle. De cette façon, vous pouvez mettre à jour vos tables de base de données sans perdre toutes les données de l'application. Si vous rencontrez souvent ce problème, envisagez d'utiliser South - une application Django qui migrera vos tables pour vous.

0 votes

Vous avez ici la réponse aux principes de base les plus sûrs. J'ajouterai simplement que vous devez avoir installé sqlite3.

0 votes

Merci beaucoup pour la mention de dbshell -- J'ai utilisé shell avant, mais après avoir remplacé ma base de données par mysql, il semble que je ne puisse plus accéder à mes modèles. Le site dbshell me branche maintenant directement sur mon shell mysql -- très cool.

0 votes

D'après la réponse de Schdiewie Kay : après avoir suivi toutes les étapes ci-dessus, exécutez "manage.py migrate --run-syncdb" au lieu de "syncdb" pour Django 1.9+.

40voto

Ofri Raviv Points 10600

Une autre façon simple de le faire en utilisant Django 1.4 ou inférieur, serait

python manage.py reset app_name

qui abandonne et recrée les tables utilisées par les modèles de cette application.

Cette fonction a été abandonnée dans Django 1.3 et n'est plus disponible depuis Django 1.5.

0 votes

Voici la solution que j'ai utilisée. Elle a parfaitement fonctionné.

38 votes

la commande reset a été dépréciée dans Django 1.3 et n'est plus disponible depuis Django 1.5. Veuillez consulter ma réponse.

0 votes

La version actuelle supporte : : python manage.py reset_db

25voto

George Godik Points 1085

obtenir les déclarations DROP avec

python manage.py sqlclear app_name

alors essayez

python manage.py dbshell

et exécutez l'instruction DROP

vérifier http://docs.djangoproject.com/en/dev/ref/django-admin/

0 votes

C'est la réponse que je pensais avoir. Merci. Il se trouve que la commande de réinitialisation a bien fonctionné.

19voto

Kat Russo Points 411

J'ai eu le même problème.

Pour une résolution rapide (si vous ne vous souciez pas de perdre vos tables/données), corrigez votre fichier models.py avec les types de données souhaités, supprimez le dossier Migration et le fichier db.SQLite3,

puis ré-exécutez les commandes suivantes :

  1. python manage.py migrer
  2. python manage.py makemigrations
  3. python manage.py migrer
  4. python manage.py createsuperuser (pour créer un utilisateur admin/pswd pour gérer la page admin)
  5. python manage.py runserver

0 votes

C'est la seule solution que j'ai pu faire fonctionner. Merci !

0 votes

Cela semble être la seule solution qui fonctionne. Une réponse très sous-estimée.

1 votes

Oui, ça m'a beaucoup aidé, merci. Mais quand j'ai supprimé le dossier de migration, makemigrations Le commandement n'a pas reconnu mes modèles. J'ai donc dû recréer ce dossier et mettre __init__.py en elle, puis tout a fonctionné correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X