更新django数据库以反映现有模型的更改

the*_*tor 68 python django django-models

我已经定义了一个模型并通过它创建了它的相关数据库manager.py syncdb.现在我已经为模型添加了一些字段,我syncdb再次尝试,但没有输出.在尝试从我的模板中访问这些新字段时,我得到一个"No Such Column"异常,这让我相信syncdb实际上没有更新数据库.这里的命令是什么?

zlo*_*ady 138

从Django 1.7+开始,内置迁移支持允许保留数据的数据库模式迁移.这可能是比下面的解决方案更好的方法.

另一个不需要额外应用程序的选项是使用内置manage.py函数导出数据,清除数据库并恢复导出的数据.

下面的方法将更新您的应用程序的数据库表,但将完全销毁这些表中存在的任何数据.如果您对应用模型所做的更改不会破坏旧模式(例如,您添加了一个新的可选字段),则可以先将数据转储然后重新加载,如下所示:

Django 1.4.15及更早版本

python manage.py dumpdata <your_app> > temp_data.json
python manage.py reset <your_app>
python manage.py loaddata temp_data.json
Run Code Online (Sandbox Code Playgroud)

Django 1.5和更新版本

python manage.py dumpdata <your_app> > temp_data.json
python manage.py sqlclear <your_app> | python manage.py dbshell
python manage.py syncdb
python manage.py loaddata temp_data.json
Run Code Online (Sandbox Code Playgroud)

(该reset命令已弃用,然后在Django 1.5中删除)

如果您的更改破坏了旧架构,则无法使用 - 在这种情况下,像SouthDjango Evolution这样的工具非常棒.

  • 对于django 1.5.1用户:不再支持manage.py reset.刷新可用于删除所有内容.您也可以手动使用ALTER TABLE或DROP TABLE语句(来自django ref):python manage.py flush (20认同)

Cas*_*law 39

从Django 1.7开始,您现在可以使用本机迁移执行此操作.赶紧跑

python manage.py makemigrations <your app name>
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)


ken*_*der 33

看起来你需要的是一个迁移系统.South非常好,工作得很好,有一些自动化工具可以简化您的工作流程.并有一个很棒的教程.


注意:syncdb无法更新现有表.有时候不可能自动决定做什么 - 这就是为什么南方剧本很棒.

  • 谢谢你指出这个有趣的工具.对于任何感兴趣的人,这里有关于django数据库迁移的深刻讨论:http://code.djangoproject.com/wiki/SchemaEvolution (6认同)

Jua*_*esa 9

Django的syncdb不会改变数据库中的现有表,因此您必须手动完成.我一直这样做的方式是:

  1. 首先更改模型类.
  2. 然后运行:manage.py sql myapp.
  3. 查看它打印出来的sql,看看它是如何代表你要做的改变.
  4. 使用数据库管理器手动进行更改.
  5. 使用管理站点检查一切是否正常工作.

如果您使用的是sqllite,那么一个好的经理就是firefox插件:link


Tho*_*mel 8

另一个工具是django evolution.大多数情况下不需要丢弃表格.

django evolution

只需将其安装为任何其他django应用程序并运行:

python manage.py evolve --hint --execute