我在新的Django安装中使用了一些模型。是否可以在不丢失应用数据的情况下更改字段?
我尝试更改字段并运行python manage.py syncdb
。此命令没有输出。
重新导入管理页面以编辑已更改的模型导致TemplateSyntaxErrors,因为Django试图显示数据库中不存在的字段。
我正在使用SQLite。
我能够删除db文件,然后重新运行python manage.py syncdb
,但这有点痛苦。有没有更好的方法呢?
答案 0 :(得分:20)
Django永远不会改变现有的数据库列。 Syncdb将创建表,但它不会像Rails中那样进行“迁移”。如果你需要这样的话,请查看Django South。
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不会出于目的/设计而开箱即用。