我已经通过了一些帖子和Django文档,但仍然无法使多个数据库工作。我是Django的新手并且确实感到很困惑。
在我的项目中,一个应用程序应该使用现有的vo.sqlite3,其中包含大量数据。我希望能够在我的vo应用程序中处理这个vo.sqlite3,与默认数据库db.sqlite3(处理用户的数据库等)分开处理。
您是否有人能够指出一个简单的逐步方法来使这种设置正常工作?
非常感谢。
答案 0 :(得分: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'),
},
}
然后wharever执行查询,您可以选择数据库。
UserModel.objects.using(db).get(username=username)
db
=您的数据库名称
您可以查看完整示例here
答案 1 :(得分: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?感谢。