2009-12-31 104 views
66

我已经通过manager.py syncdb定义了模型并创建了其关联的数据库。现在我已经为模型添加了一些字段,我再次尝试syncdb,但没有输出。在尝试从我的模板中访问这些新字段时,我得到一个“No Such Column”异常,导致我相信syncdb并未实际更新数据库。这里有什么正确的命令?更新django数据库以反映现有模型中的更改

+1

您应该更改接受的答案。 – User 2015-01-14 16:58:22

回答

33

看起来像你需要的是一个迁移系统。 South真的很不错,工作得很好,有一些自动化工具来减轻你的工作流程。并有一个伟大的tutorial


注意:syncdb无法更新您的现有表。有时候不可能自动决定做什么 - 这就是为什么南方脚本非常棒。

+6

感谢您指出这个有趣的工具。任何有兴趣,有关于Django的数据库迁移这里有见地的讨论。 http://code.djangoproject.com/wiki/SchemaEvolution南显示 – theactiveactor 2009-12-31 15:37:44

+0

的链接,“南方已被弃用,从Django的1.7向上,迁移中内置了Django的核心如果你运行的是以前的版本,你可以在BitBucket上找到版本库。“所以现在怎么办? – FaithReaper 2017-11-07 14:38:09

+0

答案中的链接被打破 – 2017-11-24 14:34:10

3

deseb是一个很好的工具。

安装它之后,您可以编写./manage.py sqlevolve,它将生成必要的sql命令,以使数据库结构与您的模型保持同步。

+0

这看起来像我所需要的。 sqlevolve也会提交更改吗? – theactiveactor 2009-12-31 15:26:05

2

您需要先删除表格,然后才能使用syncdb重新创建它们。

如果你想保留你现有的数据,那么你需要卸载你的数据库, 删除你的表,运行syncdb建立一个新的数据库,然后重新加载你的旧数据到你的新表。

有工具可以解决这个问题。但是,在很多情况下,手动操作也很容易。

8

Django的syncdb不会更改数据库中的现有表,因此您必须手动执行此操作。我一直这样做的方式是:

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

如果您正在使用sqllite一个优秀的管理者是Firefox插件:link

+0

我其实认为这是最好的和最简单的解决方案 – shrimpwagon 2014-02-10 20:19:03

8

另一个工具是Django的演变。在大多数情况下,不需要删除表格。

django evolution

只要将它安装任何其他Django应用程序,然后运行:

蟒蛇manage.py演变--hint --execute

137

As of Django 1.7+, built-in migrations support , allows for database schema migrations that preserve data. That's probably a better approach than the solution below.

另一种选择,不需要额外的应用程序,是使用内置的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 

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 

(该reset命令已被废弃,然后在Django 1.5移除)

如果您的更改打破旧的架构,这将无法正常工作 - 在这种情况下,像SouthDjango Evolution这样的工具非常棒。

+0

感谢你。正是我在找的东西。 – 2010-03-04 01:51:14

+0

我认为这个解决方案是最好的。 – 2010-05-25 15:22:24

+0

谢谢,最好的解决方案:) – 2010-08-31 16:13:40

1

对于1.4.1版本及以上用户的命令已更改为

python manage.py flush 

使用它作为它会删除所有数据前请阅读official document

+0

我不明白的是flush实际上是重置数据库,因为它是在'syncdb'执行之后,但是可能新添加的字段?他们不会被创建 – 2014-09-05 12:04:28

33

从Django 1.7开始,您现在可以使用本机迁移来完成此操作。刚刚运行

python manage.py makemigrations <your app name> 
python manage.py migrate 
相关问题