【发布时间】:2013-08-09 03:52:13
【问题描述】:
我创建了一个示例 Django 应用程序,其中包含多个模型并填充了数据。
现在,我需要向其中一个模型添加一个新列吗?
这是我的担忧吗?
- 如果我在向模型添加列后执行 syncdb 会发生什么情况,它会改变表并添加新列吗?
- 还是删除所有列后创建一个新表?
有没有更好的方法来解决这个问题?
【问题讨论】:
标签: django
我创建了一个示例 Django 应用程序,其中包含多个模型并填充了数据。
现在,我需要向其中一个模型添加一个新列吗?
这是我的担忧吗?
有没有更好的方法来解决这个问题?
【问题讨论】:
标签: django
syncdb 不适用于更改数据库表。
这是the documentation(阅读:Syncdb不会改变现有表)
实现此目的的一种简洁方法是使用 3rd 方工具,例如 django south,它将为您处理迁移(在您的情况下处理更改表脚本)。
这里是南边的step by step tutorial,这里是official documentation on south
【讨论】:
alter table myapp_mymodel add column mycolumn integer; 之类的东西 - 或者取决于您的数据类型和数据库后端的任何东西。这可维护性要差得多,因此它不是首选方法,但如果您只需要稍作修改,它是一种选择。
python manage.py sql <myapp> 将输出 Django 在为应用程序创建表时将使用的 sql。这对于保持列类型的一致性非常有用,更重要的是对于获取外键约束和索引等。
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.
【讨论】:
在开发中,我经常使用重置功能。这对我很有用,因为我不介意泄露开发数据。它基本上只为那个应用程序创建新的数据库表——所以它会删除你的数据。如果您希望保持数据填充,则无用,如上所述,南方更好。
python manage.py reset <app-name>
【讨论】:
reset 自 1.5 起已弃用。当您的情况足够简单时,它很方便,但它可能会在约束方面遇到重大问题。 code.djangoproject.com/ticket/14268 链接到一些细节,以及注释“重置单个表是一个难题;在这种情况下,Django 不能替代优秀的 DBA。”