Django 1.7中的Django-migrations检测到模型更改,但不会在迁移时应用它们

时间:2014-10-28 22:16:55

标签: django django-migrations

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

我认为Django 1.7 - "No migrations to apply" when run migrate after makemigrations可能适用于我的情况,我确实在我的数据库的django_migrations表中找到了一些历史记录。我删除了我尝试迁移的应用的记录。

最近我放弃了获取alter table语句来生成/运行并删除了表的原始版本。虽然manage.py迁移状态正在应用迁移,但数据库没有任何反应。

以下是我一直在尝试的步骤:

删除历史记录。

rm -r myapp/migrations
../manage.py dbshell
myapp_db=> delete from django_migrations where app='myapp'

创建初始迁移。

cp myapp/models.py.orig myapp/models.py
../manage.py makemigrations myapp
../manage.py migrate

manage.py migrate返回以下内容:

....
Running migrations:
  Applying myapp.0001_initial... FAKED

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

cp myapp/models.py.new myapp/models.py
../manage.py makemigrations myapp

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,),
        ),
    ]

运行此迁移:

../manage.py migrate

manage.py migrate就像一切正常一样:

....
Running migrations:
  Applying myapp.0002_notificationlog... OK

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

我输了。知道下一步该尝试什么吗?

更新

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

Running pre-migrate handlers for application auth

后面跟着每个已安装应用的类似行。

然后

Loading 'initial_data' fixtures...
Checking '/var/www/environment/default/myproj/myproj' for fixtures...
No fixture 'initial_data' in '/var/www/environment/default/myproj/myproj'.

共重复13次,非托管应用程序的数量。

然后

Running migrations:
  Applying myapp.0001_initial... FAKED

接着是

Running post-migrate handlers for application auth

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

对于迁移0002,除

外,输出相同
Running migrations:
  Applying myapp.0002_notificationlog... OK

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

../manage.py sqlmigrate myapp 0002 -v 3

根本不产生任何东西。

更新2

我将myapp复制到一个新项目中并能够对其进行迁移,但是在导入主项目设置时迁移停止了。我应该注意哪些设置可能会影响迁移执行,特别是如果我在以前版本的Django中使用South?

1 个答案:

答案 0 :(得分:3)

问题随着通用项目设置而消失,并重新出现在旧的复杂项目设置中。我将问题跟踪到缺少allow_migrate方法的数据库路由器类。

DATABASE_ROUTERS = [ 'myproj.routers.DatabaseAppsRouter', ]

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

可悲的是,除了我自己,我不能责怪任何人,因为Django documentation州明确表示:

  

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

我刚刚创建了这个路由器,当我升级到Django 1.7时,没有将allow_migrate方法添加到我的路由器类中。当我添加方法并确保在需要时返回True时,将运行迁移并解决问题。