我在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)以反映模型或指出我做错了什么?
答案 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 +):
你可以试试这个!
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 migrate <app_name> --fake
创建表格(--fake
将跳过SQL执行,因为数据库中已存在表格)- 更改应用的模型
- 调用
./manage.py schemamigration <app_name> --auto
- 然后将更改应用于数据库:
醇>./manage.py migrate <app_name>
当模型需要任何更改时,重复步骤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