django没有这样的表: [英] django no such table:

查看:139
本文介绍了django没有这样的表:的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在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 +):



TT


您可以尝试!

  python manage.py makemigrations 

python manage.py migration --run-syncdb




< hr>

已过时,南方迁移插件




正如我所见,您以错误的顺序完成了所有操作,要修复此问题,您应该
填写此清单(我假设您无法删除sqlite3数据库
文件重新开始):


  1. 获取任何SQLite GUI工具(即 http ://sqliteadmin.orbmu2k.de/

  2. 更改模型定义以匹配数据库定义(最好的方法是注释新字段)

  3. 戴尔ete模型中的 migrations 文件夹

  4. 删除 south_migrationhistory 表中的行,其中 app_name 与您的应用程序名称匹配(可能是 homework

  5. 调用: ./ manage.py schemamigration< app_name> --initial

  6. 通过创建表。/manage.pymigration< app_name> --fake -fake 将跳过SQL执行,因为表已存在于数据库中)

  7. 更改应用程序的模型

  8. 调用。/manage.py schemamigration< app_name> --auto

  9. 然后将更改应用于数据库: ./ 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+):

T.T wrote:

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):

  1. Grab any SQLite GUI tool (i.e. http://sqliteadmin.orbmu2k.de/)
  2. Change your model definition to match database definition (best approach is to comment new fields)
  3. Delete migrations folder in your model
  4. Delete rows in south_migrationhistory table where app_name match your application name (probably homework)
  5. Invoke: ./manage.py schemamigration <app_name> --initial
  6. Create tables by ./manage.py migrate <app_name> --fake (--fake will skip SQL execute because table already exists in your database)
  7. Make changes to your app's model
  8. Invoke ./manage.py schemamigration <app_name> --auto
  9. Then apply changes to database: ./manage.py migrate <app_name>

Steps 7,8,9 repeat whenever your model needs any changes.

这篇关于django没有这样的表:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆