3

可能重复:
更新 django 数据库以反映现有模型的变化

我过去曾使用过 Django,而我对它作为 ORM 工具的挫败感之一是无法通过模型的更改来更新现有数据库。(Hibernate 在这方面做得很好,并且使更新和大量修改模型并将其应用到现有数据库变得非常容易。)有没有一种方法可以做到这一点而无需 每次都擦除数据库?在我想玩的模型的每次更改之后,必须重新生成管理员用户和网站,这真的很老了。

4

4 回答 4

9

You will want to look into South. It provides a migrations system to migrate both schema changes as well as data from one version to the next.

It's quite powerful and the vast majority of changes can be handled simple by going

manage.py schemamigration --auto
manage.py migrate

The auto functionality does have it limits, and especially if the change is going to be run on a production system eventually you should check the code --auto generated to be sure it's doing what you expect.

South has a great guide to getting started and is well documented. You can find it at http://south.aeracode.org

于 2011-07-31T23:41:22.260 回答
1

不。

正如命令的文档所述syncdb

Syncdb 不会改变现有的表

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

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

于 2011-07-31T23:11:58.847 回答
0

South 似乎是大多数人解决这个问题的方式,但是一个非常快速和简单的方法是直接通过数据库的交互式 shell 更改数据库。只需启动您的 db shell(通常只是dbshell)并手动更改、添加、删除您需要使用 db 语法更改的字段和表。

您可能想运行manage.py sqlall appname查看 Django 在创建更新表时将运行的 sql 语句,然后根据需要使用这些语句来更改数据库表和字段。

Django 书的对数据库模式进行更改部分有一些如何做到这一点的示例:http: //www.djangobook.com/en/1.0/chapter05/

于 2011-08-01T01:12:11.677 回答
0

我手动进入数据库——不管你用的是什么:MySQL、PostgreSQL 等——来更改数据库信息,然后我相应地调整 models.py 以供参考。我知道有 Django South,但我不想打扰使用另一个 3rd 方应用程序。

于 2011-08-01T01:24:39.580 回答