64

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

阅读完这篇文章后,我意识到这可能是由于 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)反映模型或指出我做错了什么?

4

9 回答 9

124

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

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

TT 写道

你可以试试这个!

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。

于 2012-10-08T16:44:31.117 回答
94

你可以试试这个!

python manage.py migrate --run-syncdb

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

于 2016-08-19T03:35:33.043 回答
12

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

python manage.py makemigrations

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

python manage.py migrate --run-syncdb

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

于 2017-11-21T08:57:18.800 回答
2

我想也许你可以试试

python manage.py syncdb

sqlite3都需要syncdb

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

它应该看起来像xxx.s3db

于 2013-08-10T16:46:45.253 回答
2

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

于 2012-10-08T16:05:39.580 回答
2

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

  • python manage.py makemigrations
  • python manage.py migrate
  • python manage.py createsuperuser
  • python manage.py runserver . 转到管理页面现在一切正常。
于 2020-07-06T19:37:23.290 回答
2

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

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

于 2018-09-19T07:49:42.987 回答
0

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

于 2021-05-04T10:26:58.937 回答
-1
(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-03-21T23:41:43.207 回答