【问题标题】:South migration files empty with populated models.py file南迁移文件为空,填充了 models.py 文件
【发布时间】:2014-07-31 14:05:20
【问题描述】:

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

无奈之下,我从默认表和迁移目录中删除了南表。

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

还有我的模型样本:

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 时,它会检测到我模型中的类,所以我认为我的路由器有问题?!为了理智起见,我不得不提一下,这段代码在我之前正在运行的项目中运行!

【问题讨论】:

  • 迟到的评论,但我有同样的症状(空迁移文件)。这是一个添加到我们现有数据库中的全新项目,模型位于 app/models/ 中的单独文件中。当我添加(默认)app_label 时,它找到了我的模型,这让我认为您在调用 schemamigration --initial 时需要使用 app_label ..

标签: python django django-south


【解决方案1】:

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

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

【讨论】:

  • 如果我再次添加南,我需要运行syncdb,否则默认数据库中不存在历史表。添加南后,我应该再次运行syncdb吗?这让我回到了之前的问题。
  • 哦,你没有提到我应该删除表。反正我按照你说的做了。添加回 south 运行 manage.py schemamigration Exercise --initial 后跟 manage.py migrate Exercise --fake。但是迁移文件还是空的,没有添加新模型。
  • 添加south 后,执行syncdb 添加南表。然后,由于您的应用程序表已经存在,您应该使用/manage.py migrate myapp 0001 --fake 创建一个假迁移。请参阅此处了解更多信息——south.readthedocs.org/en/latest/…
  • 我已经尝试过了,但新模型条目从未被检测到并添加?
  • syncdb 之后试试这个。 ./manage.py convert_to_south myapp
猜你喜欢
  • 2014-08-22
  • 2012-09-26
  • 2014-01-11
  • 2014-08-18
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
相关资源
最近更新 更多