我当前的项目正在扩展地理内容,因此我正在尝试集成 GeoDjango 并为初学者导入一些形状文件。我的设置包括以下内容:
- MySQL 5.0 作为“默认”数据库,以前是唯一的数据库。
- Spatialite 作为“gis”数据库,只能用于从 shapefile 导入区域
- 整个项目都使用
South
现在我已经在一个新应用程序中为我的区域创建了一个 GeoDjango 模型。像往常一样,我已经完成了 ./manage.py schemamigration --initial
,当我尝试执行 ./manage.py migrate $my_new_app --database="gis"
时,它失败了,并出现 django.db.utils.DatabaseError: no such table: South_migrationhistory
,我猜这是正确的,因为 south_migrationhistory
在我的主数据库中。
有人有此类设置的经验并可以帮助我吗?
编辑:我更改了标题,因为我意识到这个问题实际上并不是 GeoDjango 特定的。
最佳答案
我改进的灵魂:
在其他数据库中创建表 south_migrationhistory
:
./manage.py syncdb --database="my_db_name_for_apps"
您现在可以使用标准:
./manage.py migrate my_app
这是我实际的db_router.py
# -*- coding: UTF-8 -*-
apps =['app1', 'app2' ]
db_name = 'my_db_name_for_apps'
class sh_router(object):
"""A router to control all database operations on models from applications in apps"""
def db_for_read(self, model, **hints):
"""Point all operations on apps models to db_name"""
if model._meta.app_label in apps :
return db_name
return None
def db_for_write(self, model, **hints):
"""Point all operations on apps models to db_name"""
if model._meta.app_label in apps:
return db_name
return None
def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation if a model in apps is involved"""
if obj1._meta.app_label in apps or obj2._meta.app_label in apps:
return True
return None
def allow_syncdb(self, db, model):
"""Make sure the apps only appears on the db_name db"""
if model._meta.app_label in ['south']:
return True
if db == db_name:
return model._meta.app_label in apps
elif model._meta.app_label in apps:
return False
return None
关于django - 可以同时使用多个数据库和 South 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7029228/