2014-10-28 44 views
2

我一直試圖使用1.7中的遷移來同步Django應用中的模型更改(postgres 9.1 - 讓我知道是否需要更多的細節我的環境),但manage.py遷移似乎沒有做任何事情,並且sqlmigrate不會發出任何SQL。Django 1.7中的Django-migrations檢測到模型更改,但不適用於遷移

我認爲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遷移返回如下:

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

然後我換的新車型,併產生新的遷移。

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

makemigrations的結果是在MYAPP /遷移/ 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遷移的作用就像一切都OK:

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

I可以看到日誌條目出現在django_migrations中,但該表未創建。

我迷路了。任何想法接下來要嘗試什麼?

更新

當運行遷移-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?

+0

所有這些步驟最初在Django 1.7上執行,然後在1.7.1上重新測試。 – Chris 2014-10-28 22:20:46

+0

再次運行該過程,但使用''./manage.py migrate -v 3'''。這應該打印出額外的信息。請在你的問題中包含這些信息。 – schillingt 2014-10-28 23:01:09

+0

我更新了結果,但輸出結果不足以說明問題。我想我會用相同的模型創建一個新項目,看看它是否與我的環境有關。 – Chris 2014-10-28 23:52:18

回答

2

這個問題在通用項目設置中消失了,而我的舊複雜項目設置又出現了。我將問題追溯到缺少allow_migrate方法的數據庫路由器類。

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

我使用此路由器來處理項目中單獨應用程序的查詢(只讀/ MySQL)。

可悲的是,我不能責怪任何人,但我自己,因爲Django documentation國明確:

注意,遷移將只是默默不上的模型進行任何操作爲此[allow_migrate]返回FALSE。 (link)

我創造了這個路由器前一段時間,並沒有在allow_migrate方法添加到我的路由器上課的時候我升級到Django的1.7。當我添加該方法並確保在需要時返回True,遷移運行並解決問題。

相關問題