2017-09-26 154 views
0

前段时间,我开发了一个Django 1.8项目。几个月前我部署了这个项目,一切都运行良好。今天,我必须对数据库进行更改,但是当我尝试运行python manage.py makemigrations时,我收到了消息“未检测到更改”。然后我注意到项目的任何应用程序中都没有迁移文件夹。我不明白的是:已迁移应用但没有迁移文件夹

  • 我所做的迁移(makemigrations然后migrate)当我第一次部署的项目,一切正常。虽然我没有检查迁移文件夹在那里。
  • 自第一次迁移以来,我没有对数据库进行任何更改,也没有删除任何文件夹。

当我运行python manage.py showmigrations,我得到如下:

admin 
[X] 0001_initial 
auth 
[X] 0001_initial 
[X] 0002_alter_permission_name_max_length 
[X] 0003_alter_user_email_max_length 
[X] 0004_alter_user_username_opts 
[X] 0005_alter_user_last_login_null 
[X] 0006_require_contenttypes_0002 
contenttypes 
[X] 0001_initial 
[X] 0002_remove_content_type_name 
sessions 
[X] 0001_initial 

这是完整输出。没有任何我的应用程序的迹象。

所以我的问题有以下几点:

  • 这怎么可能是迁移进行了改造,表创建等,但不迁移文件夹的创建?
  • 我该从哪里出发?我想进行新的迁移,但几乎所有重新迁移迁移的方法都包括步骤“删除迁移文件夹”。

回答

3

允许应用程序没有迁移。只有具有migrations/__init__.py文件的应用才会被视为进行迁移。除非您显式传递应用程序名称,否则manage.py makemigrations将不会为未迁移的应用程序创建迁移。在Django 1.7/1.8上,表格仍然是通过旧的syncdb机制自动创建的 - 从Django 1.9开始,这需要在迁移时使用--syncdb标志。

现在您需要将您的迁移与数据库同步。为此,您需要:

  1. 恢复最初运行manage.py migrate后所做的所有模型更改。
  2. 运行manage.py makemigrations <app_label>以创建与您当前数据库匹配的初始迁移。
  3. 运行manage.py migrate --fake-initial <app_label>将新迁移标记为已应用。

对每个应用程序运行这些步骤后,您的迁移应与数据库同步,因此您现在可以编辑模型并创建新的迁移。

+0

这是完美的,非常感谢你。非常好的解决方案,使我能够保存所有的数据。我忘记了用'startapp'创建的迁移文件夹,并且因为我没有将它们包含在git中,所以在拉到服务器时我没有它们。 – Deuce