【问题标题】:Adding new columns in Django models [duplicate]在 Django 模型中添加新列 [重复]
【发布时间】:2013-08-09 03:52:13
【问题描述】:

我创建了一个示例 Django 应用程序,其中包含多个模型并填充了数据。

现在,我需要向其中一个模型添加一个新列吗?

这是我的担忧吗?

  1. 如果我在向模型添加列后执行 syncdb 会发生什么情况,它会改变表并添加新列吗?
  2. 还是删除所有列后创建一个新表?

有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: django


    【解决方案1】:

    syncdb 不适用于更改数据库表。 这是the documentation(阅读:Syncdb不会改变现有表)

    实现此目的的一种简洁方法是使用 3rd 方工具,例如 django south,它将为您处理迁移(在您的情况下处理更改表脚本)。

    这里是南边的step by step tutorial,这里是official documentation on south

    【讨论】:

    • South 已成为管理此问题的主要工具,但您也可以修改架构以直接添加列。 alter table myapp_mymodel add column mycolumn integer; 之类的东西 - 或者取决于您的数据类型和数据库后端的任何东西。这可维护性要差得多,因此它不是首选方法,但如果您只需要稍作修改,它是一种选择。
    • 同意。尤其是当项目处于开发初期,而你还在本地开发时,这是一个不错的选择
    • 如果您最终手动进行更改,python manage.py sql <myapp> 将输出 Django 在为应用程序创建表时将使用的 sql。这对于保持列类型的一致性非常有用,更重要的是对于获取外键约束和索引等。
    【解决方案2】:

    syncdb 不会添加新列,如果表已经存在,则不会创建新表。我以前做的事情就是在模型中添加字段名称之后。进入外壳并输入:

    $ python manage.py dbshell 
    
    you will get directly within your database shell (mysql or psql) it up to what database
    you are using.
    
    mysql> | psql> ALTER TABLE <table_name> ADD column varchar(100);
    
    and it will add the new column to your table, doesn't matter if the table it already populated or not.
    

    【讨论】:

      【解决方案3】:

      在开发中,我经常使用重置功能。这对我很有用,因为我不介意泄露开发数据。它基本上只为那个应用程序创建新的数据库表——所以它会删除你的数据。如果您希望保持数据填充,则无用,如上所述,南方更好。

      python manage.py reset <app-name>
      

      【讨论】:

      • reset 自 1.5 起已弃用。当您的情况足够简单时,它很方便,但它可能会在约束方面遇到重大问题。 code.djangoproject.com/ticket/14268 链接到一些细节,以及注释“重置单个表是一个难题;在这种情况下,Django 不能替代优秀的 DBA。”
      猜你喜欢
      • 2020-04-20
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2018-10-16
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多