Django: 如何更改模型而不清空所有数据?

16 投票
3 回答
15485 浏览
提问于 2025-04-15 22:13

我在一个新的Django项目中正在处理一些模型。请问可以在不丢失应用数据的情况下更改字段吗?

我尝试过更改字段,然后运行 python manage.py syncdb。但是这个命令没有任何输出。

当我重新进入管理页面去编辑更改后的模型时,出现了模板语法错误,因为Django试图显示数据库中不存在的字段。

我使用的是SQLite数据库。

我可以删除数据库文件,然后重新运行 python manage.py syncdb,但这样做有点麻烦。有没有更好的方法呢?

3 个回答

6

如果你只是想添加或删除数据库中的列,那你需要手动更新数据库的结构或布局。

如果你想要重命名一个列,那就得找其他方法来实现。

你可以使用 python manage.py sql [应用名称] (http://docs.djangoproject.com/en/dev/ref/django-admin/#sql-appname-appname) 这个命令来查看新的SQL应该是什么样的,看看Django会让你添加哪些类型和规格的列,然后手动运行相应的 ALTER TABLE 命令。

虽然有一些应用或项目可以让模型和数据库管理变得更简单,但Django本身并不直接支持这些功能,这是故意设计的。

8

当然有啦。
你可以看看这个网站:South

20

Django不会自动修改已经存在的数据库列。Syncdb会创建表格,但它不进行像Rails那样的“迁移”。如果你需要类似的功能,可以看看Django South

关于syncdb的详细信息,可以查看官方文档

Syncdb不会改变已经存在的表格。

syncdb只会为那些还没有安装的模型创建表格。它不会发出ALTER TABLE的命令来匹配安装后模型类的变化。模型类和数据库结构的变化往往会有一些不确定性,这时候Django可能会猜测该做哪些正确的修改。这样做有可能会导致重要数据的丢失。

如果你对模型进行了修改,并希望更改数据库表格以匹配这些修改,可以使用sql命令来显示新的SQL结构,然后将其与现有的表格结构进行比较,以找出需要的更改。

你需要通过sqlite提供的管理工具手动更改数据库中的列名。我之前在MySQL中做过这个操作,MySQL允许你在不影响数据的情况下更改列名,所以这没问题。

撰写回答