django geen dergelijke tabel:

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

TTschreef:

Je kunt dit proberen!

python manage.py makemigrations
python manage.py migrate --run-syncdb

Verouderd voor southmigratieplug-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):

  1. Pak een willekeurige SQLite GUI-tool (bijv. http://sqliteadmin.orbmu2k.de/)
  2. Verander uw modeldefinitie zodat deze overeenkomt met de databasedefinitie (de beste manier is om commentaar te geven op nieuwe velden)
  3. Verwijder de map migrationsin uw model
  4. Verwijder rijen in de tabel south_migrationhistorywaarin app_nameovereenkomt met uw toepassingsnaam (waarschijnlijk homework)
  5. Oproepen: ./manage.py schemamigration <app_name> --initial
  6. Maak tabellen door ./manage.py migrate <app_name> --fake(--fakeslaat SQL-uitvoering over omdat de tabel al in uw database bestaat)
  7. Wijzigingen aanbrengen in het model van uw app
  8. Roep ./manage.py schemamigration <app_name> --auto
  9. 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%

sqlalldrukt alleen de SQL af, maar voert deze niet uit. syncdbmaakt 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 

Other episodes