【发布时间】: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