django没有这样的表:

问题描述 投票:34回答:6

我在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;

然后我按照启动和运行现有应用程序的指示安装了South,以期成功同步这些表。没有快乐。

任何人都可以建议我如何获取数据库(sqlite3)来反映模型或指出我做错了什么?

django django-south
6个回答
49
投票

Updated answer for Django migrations without south plugin:

就像T.T在他的answer中提到的那样,我之前的答案是针对south迁移插件,当时Django没有任何架构迁移功能。现在(适用于Django 1.9+):

T.T wrote

你可以试试这个!

python manage.py makemigrations

python manage.py migrate --run-syncdb

过时的south迁移插件

正如我可以看到你以错误的顺序完成所有操作,要修复它你应该完成这个清单(我假设你不能删除sqlite3数据库文件重新开始):

  1. 抓住任何SQLite GUI工具(即http://sqliteadmin.orbmu2k.de/
  2. 更改模型定义以匹配数据库定义(最佳方法是注释新字段)
  3. 删除模型中的migrations文件夹
  4. 删除south_migrationhistory表中app_name与您的应用程序名称匹配的行(可能是homework
  5. 调用:./manage.py schemamigration <app_name> --initial
  6. 通过./manage.py migrate <app_name> --fake创建表(--fake将跳过SQL执行因为表已存在于您的数据库中)
  7. 更改您应用的模型
  8. 调用./manage.py schemamigration <app_name> --auto
  9. 然后将更改应用于数据库:./manage.py migrate <app_name>

只要模型需要任何更改,步骤7,8,9就会重复。


72
投票

你可以试试这个!

python manage.py migrate --run-syncdb

我和Django 1.9和1.10有同样的问题。这段代码有效!


4
投票

如果您使用的是最新版本的django 2.x或1.11.x,那么您必须先创建迁移,

python manage.py makemigrations

之后,您只需运行migrate命令即可同步数据库。

python manage.py migrate --run-syncdb

这些将同步您的数据库和python模型,第二个命令将打印它背后的所有SQL。


2
投票

sqlall只打印SQL,它不会执行它。 syncdb将创建尚未创建的表,但不会修改现有表。


1
投票

将数据库同步到django模型的一种方法是删除数据库文件并再次运行makemigrations和migrate命令。这将从头开始将您的django模型结构反映到您的数据库中。但是,请确保在删除之前备份数据库文件,以备需要记录时使用。

这个解决方案对我有用,因为我对数据不太感兴趣,只是想让我的数据库和模型结构同步。


1
投票

我想也许你可以试试

python manage.py syncdb

即使是sqlite3也需要syncdb

您可以检查您的sql文件名

它应该看起来像xxx.s3db

© www.soinside.com 2019 - 2024. All rights reserved.