【问题标题】:Django how to get db to reflect changes to modelDjango如何让数据库反映模型的变化
【发布时间】:2014-02-09 23:20:12
【问题描述】:

我有一个预先存在的模型Item。我最近在这个模型中添加了一个 ForeignKey(User),现在我在尝试渲染页面时得到了no such column: todo_item.user_id

型号:

class Item(models.Model):
    user = models.ForeignKey(User) # new
    name = models.CharField(max_length=60)
    created = models.DateTimeField(auto_now_add=True)
    priority = models.IntegerField(default=0)
    difficulty = models.IntegerField(default=0)
    done = models.BooleanField(default=False)

manage.py sqlall 的输出:

BEGIN;                                                                                                                                                               
CREATE TABLE "todo_item" (                                                                                                                                           
    "id" integer NOT NULL PRIMARY KEY,                                                                                                                               
    "user_id" integer NOT NULL REFERENCES "auth_user" ("id"),                                                                                                        
    "name" varchar(60) NOT NULL,                                                                                                                                     
    "created" datetime NOT NULL,                                                                                                                                     
    "priority" integer NOT NULL,                                                                                                                                     
    "difficulty" integer NOT NULL,                                                                                                                                   
    "done" bool NOT NULL                                                                                                                                             
)                                                                                                                                                                    
;                                                                                                                                                                    
CREATE INDEX "todo_item_6340c63c" ON "todo_item" ("user_id");                                                                                                        

COMMIT;  

我意识到manage.py syncdb 不会改变我预先存在的表。而且我知道我可以使用 South 或类似的东西来避免丢失我的数据,但我仍处于测试模式,我不关心表中的任何当前数据。我很乐意将它擦干净以使其正常工作。其实我已经有了。

我已经跑了:

python manage.py flush todo

然后

python manage.py syncdb

这似乎应该奏效了。在我运行 flush 之后,它让我输入了一个新的管理员用户,并且我所有的 todo_item 数据都消失了。但它似乎并没有杀死 todo_item 表。如果我在 sqlite shell 中使用PRAGMA table_info(todo_item),运行这些命令后,我看不到 user_id 列。

我的问题是:除了flushsyncdb,我还需要做什么才能让数据库反映对我的模型的更改?

【问题讨论】:

  • 我无法标记它,但我认为它与以下内容重复:[更新 django 数据库以反映现有模型的变化][1] [1]:stackoverflow.com/questions/1985383/…
  • @itconlor 这个问题似乎与那个问题非常相似。但是 dm03514 下面给出的答案是我的问题的实际解决方案。并且没有被列为该问题的答案。

标签: python django sqlite django-models


【解决方案1】:

不幸的是,flush 似乎只删除了您数据库中的所有数据,然后重新加载了您的初始数据。它不会删除您的数据库/表并重新运行create 语句。

您可以输入您的数据库外壳并手动删除您的项目表(或您的整个数据库)。

python manage.py dbshell
DROP TABLE todo_item;

然后重新运行syncdb


附带说明 - 多年来我一直避免使用 south,只会更改表或删除表,然后重新同步,但对于我最近的项目,我决定试一试。 South 的学习曲线非常小,但也非常强大,因为您永远不必删除和重新同步您的表。

一旦你初始化了南,为了完成你想做的事情,你所要做的就是:

python manage.py schemamigration yourapp
python manage.py migrate yourapp

无需删除表,无需数据库,无需重新加载数据,无需在每次模型更改时重新创建超级用户

【讨论】:

  • 是的,South 很棒——即使在“测试”模式下也是如此。您以后可以随时丢弃以前的架构迁移文件!
  • 我已经研究了南方(并且很高兴它正在被添加到 django 核心),它肯定在我很快要学习的东西清单上=)。不过,现在仍在尝试通过一些非常初学者的应用程序。一旦我了解了所有组件以及如何在“普通”django 中相互作用,我将开始分支到模块,其中南可能是第一个。
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 2022-06-22
  • 2011-05-07
  • 2013-10-26
  • 2010-10-07
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多