在 Django 1.9 中我应该使用啥来代替 syncdb?

Posted

技术标签:

【中文标题】在 Django 1.9 中我应该使用啥来代替 syncdb?【英文标题】:What should I use instead of syncdb in Django 1.9?在 Django 1.9 中我应该使用什么来代替 syncdb? 【发布时间】:2015-06-23 09:03:47 【问题描述】:

看看这个:

$ pypy ./manage.py syncdb
/usr/lib64/pypy-2.4.0/site-packages/django/core/management/commands/syncdb.py:24: RemovedInDjango19Warning: The syncdb command will be removed in Django 1.9
  warnings.warn("The syncdb command will be removed in Django 1.9", RemovedInDjango19Warning)

(cut)

我运行了 quick google search,但找不到答案 - 我应该使用什么来代替 syncdb

【问题讨论】:

其实我现在再看,就在那里:syncdb has been deprecated and replaced by migrate 【参考方案1】:

syncdb 已被弃用,因为 the migration system 与 django 1.7 一起引入。

现在您可以使用makemigrations跟踪您的更改。这会将您的模型更改转换为 python 代码,以使它们可部署到另一个数据库。当您需要对数据库进行进一步修改时,可以使用data migrations。

创建迁移后,您必须应用它们:migrate

因此,您应该使用makemigrations,然后使用migrate,而不是使用syncdb

更改模型中的某些内容后的开发工作流程:

./manage.py makemigrations
./manage.py migrate

在您的生产系统上:

./manage.py migrate

奖励:您不需要为每次更改运行migrate。如果您有多项更改尚未应用,django 会以正确的顺序为您运行它们。

【讨论】:

这是最好的新功能;) 注意:makemigrations 可能需要模块名称作为参数。 这是一个糟糕的建议。如果您正在安装一个应用程序,其中有十几个迁移到一个空白数据库,您永远不应该运行migrate,因为这将浪费大量时间。 @Don Mums 的答案是正确的答案。【参考方案2】:

syncdb db 迁移有问题。所以,在 django 1.7 makemigrationsmigrate 被引入之后。 现在在 django 1.9 syncdb 已被弃用。 试试 1. python manage.py makemigrations 检测 db 中的更改并在迁移文件夹中创建一个 .py 文件 2. python manage.py migrate 会将迁移应用到数据库

【讨论】:

【参考方案3】:

您绝对应该使用migration system。这使您可以跟踪 models.py 中的更改,并为数据库创建迁移。迁移系统使用命令makemigrations创建迁移,使用migrate迁移数据库。

如果出于某种原因您需要以与syncdb 相同的方式创建数据库,那么有一个命令标志会导致migrate 以相同的方式工作。只有当您真的需要它并且您知道自己在做什么时,您才应该这样做。例如,为您选择的持续集成系统创建一个空数据库。

python manage.py migrate auth
# performs migrations for auth and contenttypes contrib apps

python manage.py migrate --run-syncdb
# creates the rest of the database

在 Django 1.9.1 上测试。

【讨论】:

+1 为实际解决方案,这应该是答案。虽然您应该在从头开始积极开发时将迁移用于生产版本,但与运行 500 次迁移相比,只需清除数据库并重新开始就更容易了。每当我进行更改时,我都会定期运行dropdb mydb && createdb mydb && python manage.py migrate --run-syncdb --run-syncdb 似乎只适用于没有迁移的应用程序。我使用了以下解决方法:find -name "migrations" -exec mv /__init__.py /__init__ \; && python manage.py migrate && python manage.py migrate --run-syncdb && find -name "migrations" -exec mv /__init__ /__init__.py \; && python manage.py migrate --fake【参考方案4】:

您应该使用 django 1.7 中引入的 makemigrationsmigrate 命令

https://docs.djangoproject.com/en/1.7/topics/migrations/

【讨论】:

以上是关于在 Django 1.9 中我应该使用啥来代替 syncdb?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS7 中,我应该使用啥来代替已弃用的 GKLeaderboardViewController?

我应该使用啥来代替 clutter_score_new?

GUITexture 已弃用,那么我应该使用啥来代替它?

我应该在 Math.max(...arr) 中使用啥来代替 Chrome 的扩展运算符?

在从 C++ 转换为 C# 的代码中,我应该使用啥来代替 memcpy?

Java 9 中不推荐使用 Observer。我们应该使用啥来代替它?