Django 1.7中的Django迁移可检测模型更改,但不会将其应用于迁移

Chr*_*ris 2 django django-migrations

我一直在尝试使用1.7中的迁移将Django应用中的模型更改同步(postgres 9.1-如果您需要更多有关我的环境的详细信息,请告诉我),但是manage.py migration似乎没有任何作用,并且sqlmigrate不发出任何SQL。

我以为Django 1.7-在进行makemigrations之后运行迁移时“不适用任何迁移”可能适用于我的情况,并且确实在数据库的django_migrations表中找到了一些历史记录。我删除了我要迁移的应用程序的记录。

最近,我放弃了让alter table语句生成/运行并放弃该表的原始版本。尽管manage.py migration声明它正在应用迁移,但数据库没有任何反应。

这是我一直在尝试的步骤:

删除历史记录。

rm -r myapp/migrations
../manage.py dbshell
myapp_db=> delete from django_migrations where app='myapp'
Run Code Online (Sandbox Code Playgroud)

创建一个初始迁移。

cp myapp/models.py.orig myapp/models.py
../manage.py makemigrations myapp
../manage.py migrate
Run Code Online (Sandbox Code Playgroud)

manage.py migration返回以下内容:

....
Running migrations:
  Applying myapp.0001_initial... FAKED
Run Code Online (Sandbox Code Playgroud)

然后,我换入新模型并生成新的迁移。

cp myapp/models.py.new myapp/models.py
../manage.py makemigrations myapp
Run Code Online (Sandbox Code Playgroud)

makemigrations的结果位于myapp / migrations / 0002_notificationlog.py中:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='NotificationLog',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ('tstamp', models.DateTimeField(help_text=b'Log time', auto_now_add=True)),
                ('recipient', models.CharField(max_length=100)),
                ('subject', models.TextField()),
            ],
            options={
            },
            bases=(models.Model,),
        ),
    ]
Run Code Online (Sandbox Code Playgroud)

运行此迁移:

../manage.py migrate
Run Code Online (Sandbox Code Playgroud)

manage.py migration的行为就像一切正常:

....
Running migrations:
  Applying myapp.0002_notificationlog... OK
Run Code Online (Sandbox Code Playgroud)

我可以看到日志条目出现在django_migrations中,但是未创建表。

我迷路了。知道下一步该怎么做吗?

更新资料

当按要求运行migration -v 3时,我看到

Running pre-migrate handlers for application auth
Run Code Online (Sandbox Code Playgroud)

对于每个已安装的应用程序,其后都是类似的行。

然后

Loading 'initial_data' fixtures...
Checking '/var/www/environment/default/myproj/myproj' for fixtures...
No fixture 'initial_data' in '/var/www/environment/default/myproj/myproj'.
Run Code Online (Sandbox Code Playgroud)

总共重复了13次非托管应用的数量。

然后

Running migrations:
  Applying myapp.0001_initial... FAKED
Run Code Online (Sandbox Code Playgroud)

其次是

Running post-migrate handlers for application auth
Run Code Online (Sandbox Code Playgroud)

每个已安装的应用都有类似的一行。

对于移植0002,输出相同,除了

Running migrations:
  Applying myapp.0002_notificationlog... OK
Run Code Online (Sandbox Code Playgroud)

另请注意,sqlmigrate也不输出任何内容:

../manage.py sqlmigrate myapp 0002 -v 3
Run Code Online (Sandbox Code Playgroud)

什么都不产生。

更新2

我将myapp复制到一个新项目中,并能够在其上运行迁移,但是当导入主项目设置时,迁移停止工作。我是否应该意识到有哪些设置会影响迁移执行,特别是如果我在早期版本的Django中使用South的话?

Chr*_*ris 5

该问题在常规项目设置中消失了,而在我以前的复杂项目设置中又出现了。我将问题归结为缺少allow_migrate方法的数据库Router类。

DATABASE_ROUTERS = [ 'myproj.routers.DatabaseAppsRouter', ]
Run Code Online (Sandbox Code Playgroud)

我使用此路由器来处理项目(只读/ MySQL)中单独应用程序的查询。

可悲的是,除了我自己,我不能怪任何人,因为Django文档明确指出:

请注意,对于[allow_migrate]返回False的模型,迁移只会默默地不执行任何操作。(链接)

我前一段时间创建了此路由器,并且allow_migrate在升级到Django 1.7时未将方法添加到路由器类中。当我添加该方法并确保它True在需要时返回时,将运行迁移并解决了问题。