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

16
demandé sur Richard 2009-11-09 21:38:32

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

4
répondu Henrique Bastos 2010-09-09 15:47:40

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
4
répondu Ryan Nowakowski 2010-01-14 07:02:34

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

2
répondu HardQuestions 2013-04-20 21:14:02

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!

1
répondu Jeremy Blanchard 2011-09-05 21:22:55

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.

0
répondu DealerGeek 2014-02-12 19:09:48