web-dev-qa-db-fra.com

django pas de telle table:

J'ai des modèles en Django mis en place comme ci-dessous.

class Pupil(models.Model):
    forename = models.CharField(max_length=30)
    surname = models.CharField(max_length=30)
    dateofbirth = models.DateField()
    year = models.IntegerField()
    class_group = models.CharField(max_length=30)
    email = models.EmailField(blank=True)
    assignments = models.ManyToManyField('Assignment', verbose_name='related assignments')

    def __unicode__(self):
        return u'%s %s' % (self.forename, self.surname)

class Subject(models.Model):
    name = models.CharField(max_length=30)
    level = models.CharField(max_length=30)
    teachers = models.ManyToManyField('Teacher', verbose_name='related teachers')

    def __unicode__(self):
        return self.name

class Teacher(models.Model):
    forename = models.CharField(max_length=30)
    surname = models.CharField(max_length=30)
    email = models.EmailField(blank=True)

    def __unicode__(self):
        return u'%s %s' % (self.forename, self.surname)

class Assignment(models.Model):
    assignment_name = models.CharField(max_length=30)
    date_assigned = models.DateField()
    date_submitted = models.DateField()

    def __unicode__(self):
        return self.assignment_name

Lorsque j'essaie d'ajouter un élève et d'attacher une affectation à l'élève dans l'administrateur, j'obtiens une erreur de base de données -

no such table: homework_pupil_assignments

après avoir lu this J'ai réalisé que cela pouvait être dû à Django ne mettant pas à jour les modifications de mes modèles comme lorsque je le fais manage.py sqlall homework

Je vois ce qui suit:

BEGIN;
CREATE TABLE "homework_pupil_assignments" (
    "id" integer NOT NULL PRIMARY KEY,
    "pupil_id" integer NOT NULL,
    "assignment_id" integer NOT NULL,
    UNIQUE ("pupil_id", "assignment_id")
)
;
CREATE TABLE "homework_pupil" (
    "id" integer NOT NULL PRIMARY KEY,
    "forename" varchar(30) NOT NULL,
    "surname" varchar(30) NOT NULL,
    "dateofbirth" date NOT NULL,
    "year" integer NOT NULL,
    "class_group" varchar(30) NOT NULL,
    "email" varchar(75) NOT NULL
)
;
CREATE TABLE "homework_subject_teachers" (
    "id" integer NOT NULL PRIMARY KEY,
    "subject_id" integer NOT NULL,
    "teacher_id" integer NOT NULL,
    UNIQUE ("subject_id", "teacher_id")
)
;
CREATE TABLE "homework_subject" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(30) NOT NULL,
    "level" varchar(30) NOT NULL
)
;
CREATE TABLE "homework_teacher" (
    "id" integer NOT NULL PRIMARY KEY,
    "forename" varchar(30) NOT NULL,
    "surname" varchar(30) NOT NULL,
    "email" varchar(75) NOT NULL
)
;
CREATE TABLE "homework_assignment" (
    "id" integer NOT NULL PRIMARY KEY,
    "assignment_name" varchar(30) NOT NULL,
    "date_assigned" date NOT NULL,
    "date_submitted" date NOT NULL
)
;
COMMIT;

J'ai ensuite installé South, en suivant les instructions pour être opérationnel avec une application existante, dans l'espoir de réussir la synchronisation de ces tables. Pas de joie.

Quelqu'un peut-il suggérer comment obtenir la base de données (sqlite3) pour refléter les modèles ou signaler ce que je fais mal?

40
puffin

Réponse mise à jour pour les migrations Django sans plugin south:

Comme TT suggéré dans son réponse , ma réponse précédente était pour le plugin de migration south, quand Django n'en a pas Fonctionnalités de migration de schéma. Maintenant (fonctionne dans Django 1.9+):

T.Técrit :

Vous pouvez essayer ça!

python manage.py makemigrations

python manage.py migrate --run-syncdb

Périmé pour le plugin south migrations

Comme je peux voir que vous avez tout fait dans le mauvais ordre, pour le corriger, vous devez remplir cette liste de contrôle (je suppose que vous ne pouvez pas supprimer le fichier de base de données sqlite3 pour recommencer):

  1. Prenez n'importe quel outil d'interface graphique SQLite (c'est-à-dire http://sqliteadmin.orbmu2k.de/ )
  2. Modifiez la définition de votre modèle pour qu'elle corresponde à la définition de la base de données (la meilleure approche consiste à commenter de nouveaux champs)
  3. Supprimer le dossier migrations de votre modèle
  4. Supprimer des lignes dans south_migrationhistory table où app_name correspond au nom de votre application (probablement homework)
  5. Invoquer: ./manage.py schemamigration <app_name> --initial
  6. Créer des tableaux par ./manage.py migrate <app_name> --fake (--fake ignorera l'exécution de SQL car la table existe déjà dans votre base de données)
  7. Apportez des modifications au modèle de votre application
  8. Invoquer ./manage.py schemamigration <app_name> --auto
  9. Appliquez ensuite les modifications à la base de données: ./manage.py migrate <app_name>

Les étapes 7, 8, 9 se répètent chaque fois que votre modèle a besoin de modifications.

56
WBAR

Vous pouvez essayer ça!

python manage.py migrate --run-syncdb

J'ai le même problème avec Django 1.9 et 1.10. Ce code fonctionne!

73
T.T

Si vous utilisez la dernière version de Django 2.x ou 1.11.x, vous devez d'abord créer des migrations,

python manage.py makemigrations

Après cela, il vous suffit d'exécuter la commande migrate pour synchroniser la base de données.

python manage.py migrate --run-syncdb

Ceux-ci synchroniseront votre base de données et les modèles python et la deuxième commande afficheront tous les sql derrière).

5
Shubham Sharma

sqlall imprime simplement le SQL, il ne l'exécute pas. syncdb créera des tables qui ne sont pas déjà créées, mais ne modifiera pas les tables existantes.

2
Daniel Roseman

Une façon de synchroniser votre base de données avec vos modèles Django est de supprimer votre fichier de base de données et d'exécuter à nouveau des commandes de migration et de migration. Cela reflétera votre structure de modèles Django pour Cependant, assurez-vous de sauvegarder votre fichier de base de données avant de le supprimer au cas où vous auriez besoin de vos enregistrements.

Cette solution a fonctionné pour moi car je ne me préoccupais pas beaucoup des données et je voulais juste que ma structure de base de données et de modèles se synchronise.

1
Lakshadeep

Je pense que vous pouvez peut-être essayer

python manage.py syncdb

Même sqlite besoin de syncdb

puis, vous pouvez vérifier le nom de votre fichier sql

cela devrait ressembler à xxx.s3db

1
creepyuncle