我一直在尝试使用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中,但是没有创建表 .
我迷路了 . 知道下一步该尝试什么吗?
Update
当我按要求运行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
根本不产生任何东西 .
Update 2
我将myapp复制到一个新项目中并能够对其进行迁移,但是当我导入主项目设置时,迁移停止了 . 我应该注意哪些设置可能会影响迁移执行,特别是如果我一直在使用South以及之前版本的Django?
1 回答
通用项目设置问题消失了,并重新出现在旧的复杂项目设置中 . 我将问题跟踪到缺少
allow_migrate
方法的数据库路由器类 .我使用此路由器来处理项目中单独应用程序的查询(readonly / MySQL) .
可悲的是,除了我自己,我不能责怪任何人,因为Django documentation明确指出:
我刚刚创建了这个路由器,当我升级到Django 1.7时没有将
allow_migrate
方法添加到我的路由器类中 . 当我添加方法并确保它在需要时返回True
时,迁移运行并且问题得以解决 .