Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 1.7中的Django迁移检测到模型更改,但不会在迁移时应用它们_Django_Django Migrations - Fatal编程技术网

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

Django 1.7中的Django迁移检测到模型更改,但不会在迁移时应用它们,django,django-migrations,Django,Django Migrations,我一直在尝试使用1.7中的迁移来同步Django应用程序中的模型更改(postgres 9.1-如果您需要有关我的环境的更多详细信息,请告诉我),但是manage.py migrate似乎什么都不做,sqlmigrate也不发出任何SQL 我认为这可能适用于我的情况,我在数据库中的django_migrations表中找到了一些历史记录。我删除了我尝试迁移的应用程序的记录 最近我放弃了让ALTERTABLE语句生成/运行,并放弃了表的原始版本。尽管manage.py migrate声明它正在应用

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

我认为这可能适用于我的情况,我在数据库中的django_migrations表中找到了一些历史记录。我删除了我尝试迁移的应用程序的记录

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

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

删除历史记录

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
cp myapp/models.py.new myapp/models.py
../manage.py makemigrations myapp
manage.py migrate返回以下内容:

....
Running migrations:
  Applying myapp.0001_initial... FAKED
然后我交换新模型并生成新的迁移

cp myapp/models.py.orig myapp/models.py
../manage.py makemigrations myapp
../manage.py migrate
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_迁移中,但没有创建表

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

更新

当按要求运行migrate-v3时,我看到

Running pre-migrate handlers for application auth
然后是每个已安装应用程序的类似行

然后

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

然后

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

通用项目设置的问题消失了,而我的旧的复杂项目设置又重新出现了问题。我跟踪到一个数据库路由器类,该类缺少
allow\u migrate
方法

DATABASE_ROUTERS = [ 'myproj.routers.DatabaseAppsRouter', ]
我使用这个路由器来处理项目中一个单独应用程序的查询(readonly/MySQL)

可悲的是,除了我自己,我不能责怪任何人,因为国家清楚地表明:

请注意,迁移不会在[allow_migrate]返回False的模型上执行任何操作


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

所有这些步骤最初都在Django 1.7上执行,然后在1.7.1上重新测试。再次运行该过程,但使用
/manage.py migrate-v3
。这样可以打印出更多的信息。请在您的问题中包含这些信息。我更新了结果,但输出的结果不太有启发性。我想我要用相同的模型创建一个新项目,看看它是否与我的环境有关。删除.pyc文件可能吗?这还不够