Ik heb modellen in Django ingesteld zoals hieronder.
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
Als ik probeer een leerling toe te voegen en een opdracht aan de leerling toe te voegen in de admin, krijg ik een databasefout –
no such table: homework_pupil_assignments
na het lezen van ditrealiseerde ik me dat dit te wijten kon zijn aan het feit dat django de wijzigingen in mijn modellen zoals wanneer ik manage.py sqlall homework
Ik zie het volgende:
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;
Vervolgens installeerde ik South, waarbij ik de instructies volgde om aan de slag te gaan met een bestaande app, in de hoop deze tabellen met succes te synchroniseren. Geen vreugde.
Kan iemand mij voorstellen hoe ik de database (sqlite3) de modellen kan laten weergeven of kan aangeven wat ik verkeerd doe?
Antwoord 1, autoriteit 100%
Bijgewerkt antwoord voor Django-migraties zonder south
-plug-in:
Vind ik leuk TTgesuggereerd in zijn antwoord, mijn vorige antwoord was voor de south
-migratieplug-in, wanneer Django geen functies voor schemamigratie heeft.
Nu (werkt in Django 1.9+):
Je kunt dit proberen!
python manage.py makemigrations python manage.py migrate --run-syncdb
Verouderd voor south
migratieplug-in
Zoals ik kan zien heb je het allemaal in de verkeerde volgorde gedaan, om het zo goed mogelijk te maken
vul deze checklist in (ik neem aan dat je de sqlite3-database niet kunt verwijderen)
bestand om opnieuw te beginnen):
- Pak een willekeurige SQLite GUI-tool (bijv. http://sqliteadmin.orbmu2k.de/)
- Verander uw modeldefinitie zodat deze overeenkomt met de databasedefinitie (de beste manier is om commentaar te geven op nieuwe velden)
- Verwijder de map
migrations
in uw model- Verwijder rijen in de tabel
south_migrationhistory
waarinapp_name
overeenkomt met uw toepassingsnaam (waarschijnlijkhomework
)- Oproepen:
./manage.py schemamigration <app_name> --initial
- Maak tabellen door
./manage.py migrate <app_name> --fake
(--fake
slaat SQL-uitvoering over omdat de tabel al in uw database bestaat)- Wijzigingen aanbrengen in het model van uw app
- Roep
./manage.py schemamigration <app_name> --auto
- Pas vervolgens de wijzigingen toe op de database:
./manage.py migrate <app_name>
Stappen 7,8,9 worden herhaald wanneer uw model wijzigingen nodig heeft.
Antwoord 2, autoriteit 76%
Je kunt dit proberen!
python manage.py migrate --run-syncdb
Ik heb hetzelfde probleem met Django 1.9 en 1.10. Deze code werkt!
Antwoord 3, autoriteit 10%
Als u de nieuwste versie van django 2.x of 1.11.x gebruikt, moet u eerst migraties maken,
python manage.py makemigrations
Daarna hoeft u alleen de migratieopdracht uit te voeren voor het synchroniseren van de database.
python manage.py migrate --run-syncdb
Deze zullen je database en python-modellen synchroniseren en ook het tweede commando zal alle sql erachter afdrukken.
Antwoord 4, autoriteit 2%
sqlall
drukt alleen de SQL af, maar voert deze niet uit. syncdb
maakt tabellen die nog niet zijn gemaakt, maar wijzigt geen bestaande tabellen.
Antwoord 5, autoriteit 2%
Een manier om uw database met uw django-modellen te synchroniseren, is door uw databasebestand te verwijderen en opnieuw te migreren en opdrachten te migreren. Dit zal de structuur van uw django-modellen vanaf het begin weerspiegelen in uw database. Zorg er echter voor dat u een back-up maakt van uw databasebestand voordat u het verwijdert, voor het geval u uw records nodig heeft.
Deze oplossing werkte voor mij omdat ik me niet zo druk maakte over de gegevens en ik wilde gewoon dat mijn db- en modellenstructuur synchroniseerden.
Antwoord 6, autoriteit 2%
Ik denk dat je het misschien kunt proberen
python manage.py syncdb
Zelfs sqlite3heeft syncdb
nodig
in de eerste plaats kunt u uw sql-bestandsnaam controleren
het zou eruit moeten zien als xxx.s3db
Antwoord 7, autoriteit 2%
. eerste stap db.sqlite3 bestand verwijderen
. ga naar terminal en voer commando’s uit:
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
. ga naar admin pagina
alles ok nu.
Antwoord 8
Eerste uitvoering: python manage.py makemigrations
Tweede run: python manage.py migrate
Antwoord 9
(1) delete -> db.sqlite3
(2) your App -> migrations directory-> delete all 001_initial.py and others but dont delete __init__.py
(3) open terminal ->
python manage.py makemigrations
python manage.py migrate