【问题标题】:Django: Change models without clearing all data?Django:更改模型而不清除所有数据?
【发布时间】:2010-04-30 18:36:32
【问题描述】:

我在新的 Django 安装中使用了一些模型。是否可以在不丢失应用数据的情况下更改字段?

我尝试更改字段并运行python manage.py syncdb。此命令没有输出。

重新导航到管理页面以编辑更改的模型会导致 TemplateSyntaxErrors,因为 Django 试图显示数据库中不存在的字段。

我正在使用 SQLite。

我可以删除 db 文件,然后重新运行 python manage.py syncdb,但这有点痛苦。有没有更好的方法?

【问题讨论】:

    标签: python django


    【解决方案1】:

    Django 永远不会改变现有的数据库列。例如,Syncdb 将创建表,但它不会像在 Rails 中那样进行“迁移”。如果您需要类似的东西,请查看Django South

    the docs for syndb:

    Syncdb 不会改变现有的表

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

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

    您必须通过 sqlite 提供的任何管理工具手动更改数据库中的列名。例如,我使用 MySQL 完成了此操作,并且由于 MySQL 允许您更改列名而不影响您的数据,所以没问题。

    【讨论】:

      【解决方案2】:

      当然有。
      查看South

      【讨论】:

        【解决方案3】:

        如果您只是在谈论添加/删除列,则必须手动更新数据库架构/布局。

        如果您尝试重命名列,则必须找到另一种方法。

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

        有些应用程序/项目可以更轻松地管理模型/数据库,但 Django 故意/设计不支持开箱即用。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 2021-12-17
        • 2018-12-28
        • 2021-09-04
        • 2017-07-14
        • 2016-05-04
        相关资源
        最近更新 更多