Python ORM

2 投票
3 回答
856 浏览
提问于 2025-04-15 11:42

这是一个新手理论问题——我刚开始学习Python,并且在研究Django和ORM。问题是:如果我开发了我的对象,并且在后续开发中修改了基础对象的结构、继承等,Django的ORM会自动修改数据库吗?还是说我需要进行一些转换(如果应用已经上线的话)?

比如,我一开始有一个简单的电话应用,

对象person:名字、地址、城市、州、邮政编码、电话

然后我把它改成:

对象person:称谓、名字、地址、城市、州、邮政编码、电话

对象phone:类型、电话号码

那么,我是需要手动通过数据库进行转换并修改代码,还是ORM中间件会自动进行这些更改?如果是的话,它是怎么做到的呢?

3 个回答

0

我们在应用程序的名称中加入了一个“版本”号。

我们的文件夹结构是这样的:

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。之后,我们可以从数据库中删除这些表格。

5

从Django 1.02开始(以及在1.1的最新版本中),没有自动的“模式迁移”功能。你可以选择删除现有的模式,然后让Django重新创建一个(通过运行manage.py syncdb),或者自己手动修改模式。

目前有一些工具正在开发中,用于Django的模式迁移。(我在关注South这个项目。)

4

《Django书籍》在第五章中提到了这个问题,接近章节的末尾(或者在网页版的底部)。基本上,规则是这样的:

  • 当你要添加一个字段时,首先要手动把它加到数据库里(比如用ALTER TABLE命令),然后再把这个字段加到模型里。(你可以用manage.py sqlall来查看需要执行的SQL语句。)
  • 当你要删除一个字段时,先从模型中删除它,然后执行相应的SQL语句来删除数据库中的这一列(比如用ALTER TABLE命令),以及任何相关的连接表。
  • 重命名一个字段其实就是添加/删除字段和复制数据的结合。

所以,回答你的问题,在Django中,ORM不会为你处理这些修改——但其实操作起来并不难。想了解更多信息,可以看看上面提到的那一章。

撰写回答