Django使用多个数据库

一、定义数据库

使用Django的多个数据库的第一步是告诉Django将使用的数据库服务器。 这是使用DATABASES设置完成的。 此设置将数据库别名映射到该特定连接的设置字典,该数据库别名是一种在整个Django中引用特定数据库的方法。 内部词典中的设置在DATABASES文档中有完整描述。

数据库可以包含您选择的任何别名。 当没有选择其他数据库时,Django使用具有默认别名default的数据库。

需求分析:
在进行django项目开发的时候,遇到了需要连接两个MySQL数据库的问题。同时使用django自带的admin进行后台数据管理。针对django项目中有多个app,app之间使用不同数据库的需求。
下面是 settings.py 中的DATABASES配置:

DATABASES = {
 'default': {  
 # 'ENGINE': 'django.db.backends.sqlite3',                #没有指定使用数据库的话就是使用default中的数据库
 # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),          
 },
 'db_a': {
 'ENGINE': 'django.db.backends.mysql',
 'NAME': 'student',
 'USER': 'root',
 'PASSWORD': '123',
 "HOST": "localhost",
 "PORT": '3306',
 },
 'db_b': {
 'ENGINE': 'django.db.backends.mysql',
 'NAME': 'teacher',
 'USER': 'root',
 'PASSWORD': '123',
 "HOST": "localhost",
 "PORT": '3306',
 },

其中default可以为空,但是不能删除,db_a, db_b是需要配置的数据库连接信息。

二、设置路由,将app映射到相对应的数据库

创建一个database_router.py文件,添加内容如下:

# -*- coding: utf-8 -*-
from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
 
class DatabaseAppsRouter(object):
    """
    A router to control all database operations on models for different
    databases.
      
    In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
    will fallback to the `default` database.
      
    Settings example:
      
    DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
    """
  
    def db_for_read(self, model, **hints):
        """"
        Point all read operations to the specific database.
        """
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None
 
    def db_for_write(self, model, **hints):
        """
        Point all write operations to the specific database.
        """
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None
 
    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow any relation between apps that use the same database.
        """
        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return False
        return None
 
    # for Django 1.4 - Django 1.6
    def allow_syncdb(self, db, model):
        """
        Make sure that apps only appear in the related database.
        """
 
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(model._meta.app_label) == db
        elif model._meta.app_label in DATABASE_MAPPING:
            return False
        return None
 
    # Django 1.7 - Django 1.11
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # print db, app_label, model_name, hints
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        return None

三、在settings.py中添加路由:

# 数据库路由
DATABASE_ROUTERS = ['project_name.database_router.DatabaseAppsRouter']     # 路径
 
# 根据app名称路由指定的数据库
DATABASE_APPS_MAPPING = {
 'app01': 'db_a',
 'app02': 'db_b',
}

四、为每个app的model分别指定所需要连接的数据库:

class UserProfile(models.Model):
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=64)
 
 
    def __str__(self):
        return self.name
 
    class Meta:
        app_label = 'app01'     #定义该model的app_label,对应于相应的数据库

此时实现了不同app 使用对应的数据库了, 当然也可以多个sqlite3和MySQL一起使用,甚至可以为每个app单独设置一个数据库。不设置或者没有设置的app会使用默认的数据库。

之后模型修改迁移的时候可以通过–database指定迁移使用的数据库

python manage.py makemigrations
python manage.py migrate --database=db_a

需求二:
对于一个app里想要使用不同数据库进行查询增删等,可以通过指定数据库的方式进行,使用using()方法。
如:

task = User.objects.using('db_a').filter(userId = 1)[0]
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中配置多个数据库,你需要进行以下步骤: 1. 在Django项目的settings.py文件中,找到DATABASES配置项。默认情况下,该配置项包含一个名为"default"的数据库配置。 2. 添加一个新的数据库配置,可以使用任何你想要的名称,例如"second_db"。在DATABASES中添加一个新的字典,类似于以下示例: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'first_database', 'USER': 'your_username', 'PASSWORD': 'your_password', 'HOST': 'localhost', 'PORT': '3306', }, 'second_db': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'second_database', 'USER': 'your_username', 'PASSWORD': 'your_password', 'HOST': 'localhost', 'PORT': '3306', } } ``` 在上面的示例中,我们添加了一个名为"second_db"的数据库配置,并提供了相应的数据库连接信息。 3. 在你的Django应用程序中,如果你希望使用新的数据库配置,你可以在models.py中为特定模型指定数据库。在模型类的内部,可以使用`using`属性来指定要使用数据库配置。例如: ```python class MyModel(models.Model): # 模型字段定义... class Meta: using = 'second_db' ``` 通过将模型的`Meta`类中的`using`属性设置为你想要使用数据库配置名称,你可以将该模型与特定的数据库关联起来。 这样,你就可以在Django中配置多个数据库,并根据需要在应用程序中使用不同的数据库配置。记得根据实际情况修改数据库引擎、数据库名、用户名、密码、主机和端口等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值