django没有这样的表: [英] django no such table:
问题描述
我在Django中建立了如下模型。
class Pupil(models.Model):
姓氏= models.CharField(max_length = 30)
姓=模型.CharField(max_length = 30)
dateofbirth = models.DateField()
year = models.IntegerField()
class_group = models.CharField(max_length = 30)
email = models.EmailField(blank = True)
分配= models.ManyToManyField('Assignment',verbose_name ='related assignments')
def __unicode __(self):
返回u'%s%s'%(self.forename,self.surname)
class Subject(models.Model):
name = models.CharField(max_length = 30)
级别=模型.CharField(max_length = 30)
教师=模型.ManyToManyField('教师',verbose_name ='相关教师')
def __unicode __():
return self.name
class Teacher(models.Model):
姓氏= models.CharField(max_length = 30)
姓氏= models.CharField(max_length = 30)
电子邮件=模型.EmailF ield(blank = True)
def __unicode __(self):
return u'%s%s'%(self.forename,self.surname)
class Assignment(models.Model):
任务名称= models.CharField(max_length = 30)
date_assigned = models.DateField()
date_submitted = models.DateField()
def __unicode __(self):
return self.assignment_name
当我尝试添加时一个学生并在管理员中向该学生附加作业,我收到数据库错误-
没有这样的表:homework_pupil_assignments $ b在阅读
我意识到这可能是由于django不更新对模型的更改,因为当我执行 manage.py sqlall作业
时p>
我看到以下内容:
BEGIN;
创建表 homework_pupil_assignments(
id整数NOT NULL主键,
pupil_id整数NOT NULL,
assignment_id整数NOT NULL,
UNIQUE ( pupil_id, assignment_id)
)
;
创建表 homework_pupil(
id整数NOT NULL主键,
forename varchar(30)NOT NULL,
surname varchar(30)NOT NULL ,
dateofbirth日期NOT NULL,
year整数NOT NULL,
class_group varchar(30)NOT NULL,
email varchar(75)NOT NULL
)
;
创建表 homework_subject_teachers(
id整数NOT NULL主键,
subject_id整数NOT NULL,
teacher_id整数NOT NULL,
唯一( subject_id, teacher_id)
)
;
创建表 homework_subject(
id整数NOT NULL主键,
name varchar(30)不为空,
level varchar(30)不为空
)
;
创建表 homework_teacher(
id整数NOT NULL主键,
forename varchar(30)NOT NULL,
surname varchar(30)NOT NULL ,
电子邮件 varchar(75)非空
)
;
创建表 homework_assignment(
id整数NOT NULL主键,
assignment_name varchar(30)NOT NULL,
date_assigned日期NOT NULL,
date_submitted日期NOT NULL
)
;
COMMIT;
然后我按照指示启动并运行现有应用程序安装了South,希望成功同步这些表。不开心
有人可以建议我如何获取数据库(sqlite3)以反映模型或指出我做错了什么吗?
没有 south
插件的Django迁移的更新答案:
类似于 TT 在他的 answer ,我的上一个答案是 south
迁移插件,而Django没有任何架构迁移功能。
Now(适用于Django 1.9 +):
您可以尝试!
python manage.py makemigrations
python manage.py migration --run-syncdb
< hr>
已过时,南方
迁移插件
正如我所见,您以错误的顺序完成了所有操作,要修复此问题,您应该
填写此清单(我假设您无法删除sqlite3数据库
文件重新开始):
- 获取任何SQLite GUI工具(即 http ://sqliteadmin.orbmu2k.de/ )
- 更改模型定义以匹配数据库定义(最好的方法是注释新字段)
- 戴尔ete模型中的
migrations
文件夹
- 删除
south_migrationhistory
表中的行,其中app_name
与您的应用程序名称匹配(可能是homework
)
- 调用:
./ manage.py schemamigration< app_name> --initial
- 通过
创建表。/manage.pymigration< app_name> --fake
(-fake
将跳过SQL执行,因为表已存在于数据库中)
- 更改应用程序的模型
- 调用
。/manage.py schemamigration< app_name> --auto
- 然后将更改应用于数据库:
./ manage.py migrate< app_name>
只要模型需要任何更改,就重复执行步骤7、8、9。
I have models in Django set up as below.
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
When I attempt to add a pupil and attach an assignment to the pupil in the admin, I get a database error -
no such table: homework_pupil_assignments
after reading this I realised this could be due to django not updating changes to my models as when I do manage.py sqlall homework
I see the following:
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;
I then installed South, following the directions to get up and running with an existing app, in the hope of successfully syncing these tables. No joy.
Can anyone suggest how I can get the database (sqlite3) to reflect the models or point out what I'm doing wrong?
Updated answer for Django migrations without south
plugin:
Like T.T suggested in his answer, my previous answer was for south
migration plugin, when Django hasn't any schema migration features.
Now (works in Django 1.9+):
You can try this!
python manage.py makemigrations python manage.py migrate --run-syncdb
Outdated for south
migrations plugin
As I can see you done it all in wrong order, to fix it up your should complete this checklist (I assume you can't delete sqlite3 database file to start over):
- Grab any SQLite GUI tool (i.e. http://sqliteadmin.orbmu2k.de/)
- Change your model definition to match database definition (best approach is to comment new fields)
- Delete
migrations
folder in your model- Delete rows in
south_migrationhistory
table whereapp_name
match your application name (probablyhomework
)- Invoke:
./manage.py schemamigration <app_name> --initial
- Create tables by
./manage.py migrate <app_name> --fake
(--fake
will skip SQL execute because table already exists in your database)- Make changes to your app's model
- Invoke
./manage.py schemamigration <app_name> --auto
- Then apply changes to database:
./manage.py migrate <app_name>
Steps 7,8,9 repeat whenever your model needs any changes.
这篇关于django没有这样的表:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!