Django 多数据库的简单逐步指南
我看了几个帖子和Django的文档,但还是搞不定多个数据库的设置。我是Django的新手,真的有点困惑。
在我的项目中,有一个应用需要使用一个已经存在的vo.sqlite3数据库,里面有很多数据。我想在我的vo应用中单独处理这个vo.sqlite3,而不是使用默认的数据库db.sqlite3(那个用来处理用户等信息的)。
有没有人能给我指个简单的步骤,让我能把这个设置搞定呢?
非常感谢。
2 个回答
0
不仅是上面提到的levi的解决方案有效,我甚至成功让自动路由也能工作,看看我的settings.py和routers.py。
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'db.sqlite3',
},
'vodb': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'vo.sqlite3',
}
}
DATABASE_ROUTERS = ['vo.routers.vo_Router',]
DATABASE_APPS_MAPPING = {'vo': 'vodb'}
routers.py
from django.conf import settings
class vo_Router(object):
def db_for_read(self, model, **hints):
return 'vodb'
def db_for_write(self, model, **hints):
return 'vodb'
def allow_relation(self, obj1, obj2, **hints):
db_list = ('default', 'vodb')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None
def allow_migrate(self, db, model):
return True
def allow_syncdb(self, db, model):
if db == 'vodb':
return model._meta.app_label == 'vo'
elif model._meta.app_label == 'vo':
return False
return None
缺少的部分是执行了manage.py syncdb --database=vodb
这个命令。不过,这样做在我的应用数据库vo.sqlite3
里添加了很多不必要的Django表,甚至还为我在models.py
中定义的对象创建了一个新表。
在我的情况下,我只是想把vo.sqlite3
中已经存在的(并且有数据的)表链接到models.py
中的对象。请问在Django中有没有办法做到这一点?谢谢。
1
举个例子,在你的设置里,先配置好你的数据库。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite1'),
},
'client1': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite2'),
},
}
然后无论你在哪里执行查询,都可以选择使用哪个数据库。
UserModel.objects.using(db).get(username=username)
db
就是你的数据库名称。
你可以在这里查看完整的例子 这里