请访问Django多个数据库的简单分步指南

时间:2014-08-26 03:27:11

标签: python django django-database

我已经通过了一些帖子和Django文档,但仍然无法使多个数据库工作。我是Django的新手并且确实感到很困惑。

在我的项目中,一个应用程序应该使用现有的vo.sqlite3,其中包含大量数据。我希望能够在我的vo应用程序中处理这个vo.sqlite3,与默认数据库db.sqlite3(处理用户的数据库等)分开处理。

您是否有人能够指出一个简单的逐步方法来使这种设置正常工作?

非常感谢。

2 个答案:

答案 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?感谢。