我已经在南方待了很长时间,昨天我复制了一个项目,我正在使用数据库路由器来划分我的数据库。在我的代码中唯一改变的是数据库名称,但我担心我可能正在使用错误的命令进行迁移。我运行了初始的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
时,它会检测到我的模型中的类,所以我认为我的路由器出了问题?!为了理智,我必须提到这个代码正在我之前正在运行的项目中运行!
答案 0 :(得分:0)
从south
删除INSTALLED_APPS
,再次删除所有migration
个文件夹syncdb
。
然后将south
添加回INSTALLED_APPS
并应用初始虚假迁移。