django没有这样的表:

时间:2012-10-08 15:31:27

标签: django django-south

我在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)以反映模型或指出我做错了什么?

9 个答案:

答案 0 :(得分:71)

你可以试试这个!

python manage.py migrate --run-syncdb

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

答案 1 :(得分:48)

更新了没有south插件的Django迁移的答案:

与他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. 更改模型定义以匹配数据库定义(最佳方法是评论新字段)
  4.   
  5. 删除模型中的migrations文件夹
  6.   
  7. 删除south_migrationhistory表中app_name与您的应用名称匹配的行(可能是homework
  8.   
  9. 调用:./manage.py schemamigration <app_name> --initial
  10.   
  11. ./manage.py migrate <app_name> --fake创建表格(--fake将跳过SQL执行,因为数据库中已存在表格)
  12.   
  13. 更改应用的模型
  14.   
  15. 调用./manage.py schemamigration <app_name> --auto
  16.   
  17. 然后将更改应用于数据库:./manage.py migrate <app_name>
  18.         

    当模型需要任何更改时,重复步骤7,8,9。

答案 2 :(得分:4)

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

python manage.py makemigrations

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

python manage.py migrate --run-syncdb

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我想也许你可以试试

python manage.py syncdb

即使 sqlite3 也需要syncdb

其次,您可以检查您的sql文件名

它应该看起来像 xxx.s3db

答案 5 :(得分:1)

将数据库同步到Django模型的一种方法是删除数据库文件,然后运行makemigrations并再次迁移命令。这将从头开始将django模型的结构反映到数据库中。不过,在需要删除记录之前,请务必备份数据库文件。

该解决方案对我来说很有效,因为我对数据并不太烦,只希望我的数据库和模型结构能够同步。

答案 6 :(得分:0)

。第一步,删除db.sqlite3文件 。转到终端并运行命令:

  • python manage.py makemigrations
  • python manage.py migrate
  • python manage.py createsuperuser
  • python manage.py runserver 。进入管理页面 现在一切都好。

答案 7 :(得分:0)

(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 

答案 8 :(得分:0)

第一次运行:python manage.py makemigrations
第二次运行:python manage.py migrate