【问题标题】:django no such table:django 没有这样的表:
【发布时间】:2012-09-28 21:17:46
【问题描述】:

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

【问题讨论】:

  • 你在做schemamigration之前做过convert_to_south app_name吗?
  • 是的。我还担心如果在集成 South 之前表没有正确同步,会导致问题。
  • 查看 south_migrationhistory 表,看看这个迁移是否执行
  • 您应该将您的更改撤回到与数据库外观匹配的位置,然后执行 schemamigration --initial。此时,您应该重新添加更改,执行另一个 schemamigration --auto,然后执行 migrate
  • 如何找到migrationhistory表?

标签: django django-south


【解决方案1】:

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

就像T.T 在他的answer 中建议的那样,我之前的回答是针对south 迁移插件,当时Django 没有任何架构迁移功能。 现在(在 Django 1.9+ 中工作):

T.Twrote:

你可以试试这个!

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 步。

【讨论】:

  • 我已经从 shell 中删除了所有的表。然后我同步并迁移,它似乎已经奏效了。
  • 这在 Django 1.8.7 中不起作用,因为 schemamigration 不再定义为 manage.py 的子命令
【解决方案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。

    【讨论】:

    • python manage.py migrate --run-syncdb 也在为我工作 django 3.0
    【解决方案4】:

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

    【讨论】:

    • 实际上新版本的Django不再支持syncdb,因此这个答案是错误的。
    【解决方案5】:

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

    这个解决方案对我有用,因为我不太关心数据,只是希望我的数据库和模型结构同步。

    【讨论】:

      【解决方案6】:

      我觉得你可以试试

      python manage.py syncdb
      

      即使是 sqlite3 也需要syncdb

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

      它应该看起来像 xxx.s3db

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

        • 这是为我解决的问题。我必须先删除 db.sqlite3 文件。谢谢
        【解决方案8】:

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

        【讨论】:

          【解决方案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 
          

          【讨论】:

          • 这可行,但请注意它会删除您的数据库!
          猜你喜欢
          • 2021-12-10
          • 2021-08-18
          • 2019-05-07
          • 2012-04-22
          • 2011-04-07
          • 1970-01-01
          相关资源
          最近更新 更多