Problème de base de données à Django: impossible de réinitialiser à cause des dépendances
j'essaie de réinitialiser une base de données à Django, en utilisant:
python manage.py reset app
mais obtiens l'erreur suivante:
Error: Error: app couldn't be reset. Possible reasons:
* The database isn't running or isn't configured correctly.
* At least one of the database tables doesn't exist.
* The SQL was invalid.
Hint: Look at the output of 'django-admin.py sqlreset app'. That's the SQL this command wasn't able to run.
The full error: cannot drop table app_record because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too.
C'est ce que mon models.py le fichier ressemble à:
class Record(models.Model):
name = models.CharField(max_length=50, db_index=True)
year = models.IntegerField(blank=True, null=True)
def __unicode__(self):
return self.name
class Class(models.Model):
record = models.ForeignKey(Record)
def __unicode__(self):
return self.id
je reçois ce que j'ai besoin d'utiliser le menu... Commande en CASCADE dans le SQL qui supprime et recrée la base de données (la sortie de django-admin.py).
mais comment puis-je éditer ce SQL directement à partir models.py?
UPDATE
OK, j'ai trouvé comment supprimer des tables manuellement( la base de données est postgres), Je l'ai noté ici pour n'importe qui avec le même problème:
python manage.py dbshell
# drop table app_record cascade;
# q
python manage.py reset app
Voudrais quand même savoir si quelqu'un a une meilleure façon de le faire, bien :)
5 réponses
la façon simple de réinitialiser complètement une base de données Django est d'utiliser django-extensions.
il a un reset_db
commande qui supporte toutes les sauvegardes de la base de données par défaut de Django.
python manage.py reset_db
Si vous utilisez Django 1.2+ vous devez définir explicitement la base de données que vous souhaitez réinitialiser. Si votre projet n'utilise qu'une seule base de données, vous devriez probablement définir --router=default
j'utilise un petit pipeline unix qui ajoute une CASCADE à toutes les instructions de largage.
python manage.py sqlreset myapp | sed 's/DROP TABLE \(.*\);/DROP TABLE CASCADE;/g' | \
psql --username myusername mydbname
le problème de DROP TABLE CASCADE est qu'il suffit de supprimer une touche étrangère sur les tables liées - après syncdb cette relation n'est pas recréée. Je n'ai trouvé aucun moyen de recréer les tables du modèle en question, donc je resète l'application entière en recréant schema:
DROP SCHEMA public CASCADE;
CREATE SCHEMA "public" AUTHORIZATION "owner of database";
cela devrait fonctionner uniquement avec la base de données qui prend en charge le schéma, par exemple, postgresql
en utilisant les détails dans d'autres réponses, j'ai fait une fonction de bash que j'ai laissé tomber dans ~/.bash_profile (sur Mac OS X).
django_reset () { python mainsite/manage.py sqlreset "$*" | sed 's/DROP TABLE \(.*\);/DROP TABLE CASCADE;/g' | mainsite/manage.py dbshell ; }
alors lancez juste cette commande dans le terminal à partir de votre répertoire racine (donc le chemin vers mainsite/manage.py logique).
django_reset myappA myappB
Et il va s'exécuter!
j'ai trouvé une autre façon. J'utilise sqlite3 qui vient par défaut dans Django. Pour réinitialiser la table par défaut. python manage.py rincer --base de données par défaut= après cela, vous devrez à nouveau utiliser la commande syncdb.