【问题标题】:python orm蟒蛇
【发布时间】:2023-04-17 12:19:01
【问题描述】:

这是一个新手理论问题 - 我刚刚开始使用 Python 并研究 Django 和 orm。问题:如果我开发我的对象并通过额外的开发修改基础对象结构、继承等 - Django 的 ORM 解决方案会自动修改数据库还是需要执行转换(如果应用程序是实时的)?

所以,我从一个基本的电话应用开始 对象人:姓名、地址、城市、州、邮编、电话 我改为 对象人:头衔、姓名、地址、城市、州、邮编、电话对象 对象电话:类型,电话#

我是通过数据库手动转换并更改代码还是 ORM 中间件进行更改?如果是这样 - 如何?

【问题讨论】:

标签: python database django django-models


【解决方案1】:

从 Django 1.02 开始(以及从最新的 1.1 版本开始),没有自动的“模式迁移”。您的选择是删除架构并让 Django 重新创建它(通过 manage.py syncdb),或者自己手动更改架构。

有一些工具可用于 Django 架构迁移。 (我在看South。)

【讨论】:

  • 我正在使用 South,而不仅仅是观看它,它比“删除架构并让 Django 重新创建它”或“自己手动更改架构”要好得多。
【解决方案2】:

Django 书籍在Chapter 5 中讨论了这个问题,靠近章节的末尾(或页面底部,在网络版中)。基本上,规则是:

  • 添加字段时,首先手动将其添加到数据库中(例如,使用ALTER TABLE),然后将该字段添加到模型中。 (可以使用manage.py sqlall查看要执行的SQL语句。)
  • 删除字段时,将其从模型中删除,然后执行适当的 SQL 语句以删除列(例如,ALTER TABLE 命令)以及已创建的任何连接表。
  • 重命名字段基本上是添加/删除字段以及复制数据的组合。

所以回答你的问题,在 Django 的情况下,不,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。稍后我们可以从数据库中删除表。

    【讨论】:

    • -1 与使用原始 SQL 迁移或 django-evolution 或 South 之类的工具相比,这是一个非常麻烦的解决方案。我不会向任何刚开始的人推荐它。