Django нет такой таблицы:
У меня есть модели в Django, как показано ниже.
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
Когда я пытаюсь добавить ученика и присоединяю назначение ученику к администратору, я получаю ошибку базы данных -
no such table: homework_pupil_assignments
после прочтения this Я понял, что это может быть связано с тем, что django не обновляет мои модели, как когда я делаю manage.py sqlall homework
Я вижу следующее:
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;
Затем я установил Юг, следуя инструкциям, чтобы встать и работать с существующим приложением, в надежде на успешную синхронизацию этих таблиц. Нет радости.
Может ли кто-нибудь предложить, как я могу получить базу данных (sqlite3), чтобы отразить модели или указать, что я делаю неправильно?
Ответы
Ответ 1
Обновленный ответ для миграций Django без south
плагина:
Как предложил TT в своем ответе, мой предыдущий ответ был для плагина south
миграции, когда у Django нет никаких функций миграции схемы. Сейчас (работает в Django 1. 9+):
ТТ написал :
Вы можете попробовать это!
python manage.py makemigrations
python manage.py migrate --run-syncdb
Устаревший плагин для south
миграций
Как я вижу, вы все сделали в неправильном порядке, чтобы исправить это, вы должны заполнить этот контрольный список (я полагаю, вы не можете удалить файл базы данных sqlite3, чтобы начать все сначала):
- Используйте любой инструмент SQLite GUI (например, http://sqliteadmin.orbmu2k.de/).
- Измените определение модели, чтобы оно соответствовало определению базы данных (лучший подход - комментировать новые поля)
- Удалить папку
migrations
в вашей модели - Удалите строки в таблице
south_migrationhistory
где app_name
соответствует имени вашего приложения (возможно, homework
) -
./manage.py schemamigration <app_name> --initial
: ./manage.py schemamigration <app_name> --initial
- Создайте таблицы с помощью
./manage.py migrate <app_name> --fake
(--fake
пропустит выполнение SQL, поскольку таблица уже существует в вашей базе данных) - Внесите изменения в модель вашего приложения
-
./manage.py schemamigration <app_name> --auto
- Затем примените изменения к базе данных:
./manage.py migrate <app_name>
Шаги 7,8,9 повторяются всякий раз, когда ваша модель нуждается в каких-либо изменениях.
Ответ 2
Вы можете попробовать это!
python manage.py migrate --run-syncdb
У меня та же проблема с Django 1.9 и 1.10. Этот код работает!
Ответ 3
Если вы используете последнюю версию django 2.x или 1.11.x, вы должны сначала создать миграции,
python manage.py makemigrations
После этого вам просто нужно запустить команду migrate для синхронизации базы данных.
python manage.py migrate --run-syncdb
Они будут синхронизировать вашу базу данных и модели Python, а также вторая команда напечатает все sql позади него.
Ответ 4
sqlall
просто печатает SQL, он не выполняет его. syncdb
создаст таблицы, которые еще не созданы, но не изменяет существующие таблицы.
Ответ 5
Я думаю, что вы можете попробовать
python manage.py syncdb
Даже sqlite3 нужен syncdb
во-вторых, вы можете проверить имя файла sql
это должно выглядеть как xxx.s3db
Ответ 6
Один из способов синхронизировать вашу базу данных с вашими моделями django - это удалить файл базы данных, выполнить makemigrations и снова перенести команды. Это будет отражать структуру ваших моделей Django в вашей базе данных с нуля. Тем не менее, обязательно сделайте резервную копию файла базы данных перед удалением на случай, если вам нужны ваши записи.
Это решение сработало для меня, так как я не сильно беспокоился о данных и просто хотел, чтобы моя структура БД и моделей синхронизировалась.