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?
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+):
Vous pouvez essayer ça!
python manage.py makemigrations python manage.py migrate --run-syncdb
south
migrationsComme 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):
- Prenez n'importe quel outil d'interface graphique SQLite (c'est-à-dire http://sqliteadmin.orbmu2k.de/ )
- 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)
- Supprimer le dossier
migrations
de votre modèle- Supprimer des lignes dans
south_migrationhistory
table oùapp_name
correspond au nom de votre application (probablementhomework
)- Invoquer:
./manage.py schemamigration <app_name> --initial
- 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)- Apportez des modifications au modèle de votre application
- Invoquer
./manage.py schemamigration <app_name> --auto
- 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.
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!
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).
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.
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.
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