Django 多数据库的简单逐步指南

1 投票
2 回答
1071 浏览
提问于 2025-04-18 18:31

我看了几个帖子和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 就是你的数据库名称。

你可以在这里查看完整的例子 这里

撰写回答