Python ORM
这是一个新手理论问题——我刚开始学习Python,并且在研究Django和ORM。问题是:如果我开发了我的对象,并且在后续开发中修改了基础对象的结构、继承等,Django的ORM会自动修改数据库吗?还是说我需要进行一些转换(如果应用已经上线的话)?
比如,我一开始有一个简单的电话应用,
对象person:名字、地址、城市、州、邮政编码、电话
然后我把它改成:
对象person:称谓、名字、地址、城市、州、邮政编码、电话
对象phone:类型、电话号码
那么,我是需要手动通过数据库进行转换并修改代码,还是ORM中间件会自动进行这些更改?如果是的话,它是怎么做到的呢?
3 个回答
我们在应用程序的名称中加入了一个“版本”号。
我们的文件夹结构是这样的:
project
settings.py
appA_1
__init__.py
models.py
tests.py
appB_1
__init__.py
models.py
tests.py
appB_2
__init__.py
models.py
tests.py
这里显示了两个版本的appB。appB_1是最初的版本。当我们更改模型时,我们先复制了这个应用,创建了appB_2,然后对这个新版本进行了修改。
运行manage.py syncdb
命令会创建一个全新的appB_2。
我们需要通过从appB_1复制数据到appB_2来卸载和重新加载表格,这个过程只需要做一次。
完成后,我们可以从settings.py文件中删除appB_1。之后,我们可以从数据库中删除这些表格。
从Django 1.02开始(以及在1.1的最新版本中),没有自动的“模式迁移”功能。你可以选择删除现有的模式,然后让Django重新创建一个(通过运行manage.py syncdb),或者自己手动修改模式。
目前有一些工具正在开发中,用于Django的模式迁移。(我在关注South这个项目。)
《Django书籍》在第五章中提到了这个问题,接近章节的末尾(或者在网页版的底部)。基本上,规则是这样的:
- 当你要添加一个字段时,首先要手动把它加到数据库里(比如用
ALTER TABLE
命令),然后再把这个字段加到模型里。(你可以用manage.py sqlall
来查看需要执行的SQL语句。) - 当你要删除一个字段时,先从模型中删除它,然后执行相应的SQL语句来删除数据库中的这一列(比如用
ALTER TABLE
命令),以及任何相关的连接表。 - 重命名一个字段其实就是添加/删除字段和复制数据的结合。
所以,回答你的问题,在Django中,ORM不会为你处理这些修改——但其实操作起来并不难。想了解更多信息,可以看看上面提到的那一章。