Django:在不清除所有数据的情况下更改模型?

时间:2010-04-30 18:36:32

标签: python django

我在新的Django安装中使用了一些模型。是否可以在不丢失应用数据的情况下更改字段?

我尝试更改字段并运行python manage.py syncdb。此命令没有输出。

重新导入管理页面以编辑已更改的模型导致TemplateSyntaxErrors,因为Django试图显示数据库中不存在的字段。

我正在使用SQLite。

我能够删除db文件,然后重新运行python manage.py syncdb,但这有点痛苦。有没有更好的方法呢?

3 个答案:

答案 0 :(得分:20)

Django永远不会改变现有的数据库列。 Syncdb将创建表,但它不会像Rails中那样进行“迁移”。如果你需要这样的话,请查看Django South

请参阅the docs for syndb

  

Syncdb不会改变现有的表

     

syncdb仅为尚未安装的模型创建表。它永远不会发出ALTER TABLE语句来匹配安装后对模型类所做的更改。对模型类和数据库模式的更改通常涉及某种形式的歧义,在这些情况下,Django必须猜测要进行的正确更改。存在关键数据在此过程中丢失的风险。

     

如果您对模型进行了更改并希望更改数据库表以匹配,请使用sql命令显示新的SQL结构,并将其与现有的表模式进行比较以计算更改。

您必须通过sqlite提供的任何管理工具手动更改数据库中的列名。例如,我已经使用MySQL完成了这项工作,并且由于MySQL允许您在不影响数据的情况下更改列名,因此没有问题。

答案 1 :(得分:8)

当然有。
查看South

答案 2 :(得分:5)

如果您只是在谈论添加/删除列,则必须手动更新数据库架构/布局。

如果您尝试重命名列,则必须找到另一种方法。

您可以使用python manage.py sql [app name]http://docs.djangoproject.com/en/dev/ref/django-admin/#sql-appname-appname)命令查看新SQL应该是什么样的,查看哪些列,Django将添加哪些类型/规范,然后手动运行相应的ALTER TABLE命令。

有一些应用程序/项目可以实现更轻松的模型/数据库管理,但Django不会出于目的/设计而开箱即用。