南迁移文件为空,填充的models.py文件

时间:2014-07-31 14:05:21

标签: python django django-south

我已经在南方待了很长时间,昨天我复制了一个项目,我正在使用数据库路由器来划分我的数据库。在我的代码中唯一改变的是数据库名称,但我担心我可能正在使用错误的命令进行迁移。我运行了初始的schemamigration并迁移了创建数据库(默认和练习),之后我添加了两个未被南方初始化的新模型。

在绝望中,我从默认表和包含迁移的目录中删除了南表。

请注意,数据库已经填充了表格!

我的模特样本:

class MuscleGroupName(models.Model):
    name = models.CharField(null=False)
    link = models.CharField(null=True)

    class Meta:
        app_label = 'exercise_db'
        db_table = 'musclegroupname'

命令:

./manage.py syncdb
Syncing...
Creating tables ...
Creating table south_migrationhistory
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Synced:
 > django_admin_bootstrapped
 > django.contrib.admin
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.messages
 > django.contrib.staticfiles
 > django_verbatim
 > rest_framework
 > south
 > Exercise

Not synced (use migrations):
 - 
(use ./manage.py migrate to migrate these)

./manage.py schemamigration Exercise --initial
Creating migrations directory at '/Exercise/migrations'...
Creating __init__.py in '/Exercise/migrations'...
Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate Exercise

./manage.py migrate Exercise 
Running migrations for Exercise:
 - Migrating forwards to 0001_initial.
 > Exercise:0001_initial
 - Loading initial data for Exercise.
Installed 0 object(s) from 0 fixture(s)

此时0001_initial.py文件几乎是空的,没有模型或任何东西:

# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models


class Migration(SchemaMigration):

    def forwards(self, orm):
        pass

    def backwards(self, orm):
        pass

    models = {

    }

    complete_apps = ['Exercise']

源代码:

# settings.py
DATABASE_ROUTERS = ['Exercise.router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {'exercise_db': 'exercises',}
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'special2_django',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',   # Or an IP Address that your DB is hosted on
        'PORT': '8889',
    },
    'exercises': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'special2_exercise',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',   # Or an IP Address that your DB is hosted on
        'PORT': '8889',
    }     
}

# router.py
class DatabaseAppsRouter(object): 
    def db_for_read(self, model, **hints):
        """"Point all read operations to the specific database."""
        if settings.DATABASE_APPS_MAPPING.has_key(model._meta.app_label):
            return settings.DATABASE_APPS_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
        """Point all write operations to the specific database."""
        if settings.DATABASE_APPS_MAPPING.has_key(model._meta.app_label):
            return settings.DATABASE_APPS_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """Allow any relation between apps that use the same database."""
        db_obj1 = settings.DATABASE_APPS_MAPPING.get(obj1._meta.app_label)
        db_obj2 = settings.DATABASE_APPS_MAPPING.get(obj2._meta.app_label)
        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return False
        return None

    def allow_syncdb(self, db, model):
        """Make sure that apps only appear in the related database."""
        if db in settings.DATABASE_APPS_MAPPING.values():
            return settings.DATABASE_APPS_MAPPING.get(model._meta.app_label) == db
        elif settings.DATABASE_APPS_MAPPING.has_key(model._meta.app_label):
            return False
        return None

更新:

当我删除app_label时,它会检测到我的模型中的类,所以我认为我的路由器出了问题?!为了理智,我必须提到这个代码正在我之前正在运行的项目中运行!

1 个答案:

答案 0 :(得分:0)

south删除INSTALLED_APPS,再次删除所有migration个文件夹syncdb

然后将south添加回INSTALLED_APPS并应用初始虚假迁移。

相关问题