在 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 makemigrations
和 migrate
被引入之后。
现在在 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 中引入的 makemigrations
和 migrate
命令
https://docs.djangoproject.com/en/1.7/topics/migrations/
【讨论】:
以上是关于在 Django 1.9 中我应该使用啥来代替 syncdb?的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS7 中,我应该使用啥来代替已弃用的 GKLeaderboardViewController?
我应该在 Math.max(...arr) 中使用啥来代替 Chrome 的扩展运算符?