django使用多个数据库实现

yizhihongxing

一、说明:

  在开发 Django 项目的时候,很多时候都是使用一个数据库,即 settings 中只有 default 数据库,但是有一些项目确实也需要使用多个数据库,这样的项目,在数据库配置和使用的时候,就比较麻烦一点。

二、Django使用多个数据库中settings中的DATABASES的设置

  2.1 默认只是用一个数据库时 DATABASES 的设置(以 SQLite 为例)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',         
        'NAME': 'db.sqlite3',
    }
}

  2.2 Django 数据库支持的 ENGINE 类型

    • 'django.db.backends.postgresql'
    • 'django.db.backends.mysql'
    • 'django.db.backends.sqlite3'
    • 'django.db.backends.oracle'

  2.3 设置了多个数据库后 settings 中的 DATABASES 的设置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'db.sqlite3',
    },
    'db1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql_test_db1',
        'USER': 'root',
        'PASSWORD': 'Se7eN521',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    },
    'db2': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql_test_db2',
        'USER': 'root',
        'PASSWORD': 'Se7eN521',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}

三、实现思路

  1. 多个应用对应多个数据库和一个应用对应多个数据库
    1. 情况一:项目有多个 应用app 且需要使用到多个数据库
    2. 情况二:项目只有一个应用app, 且但需要使用到多个数据库,
  2. 这两种情况的实现思路其实都是一样的,都是为每个数据库创建一个应用,即这个应用只对接一个数据库,如果这个应用不需要写任何业务逻辑的代码,也需要创建一个空的应用,主要是用来做数据库迁移的
  3. 核心思想就是:一个model类对应一个数据库,通过数据库路由和model定义时指定的all_label来实现。

四、案例实现

  第一步:创建需要的 应用app,并且在 INSTALLED_APPS 中引用

    其中db1_app这个应用主要是用来对接数据库db1的

    其中db2_app这个应用主要是用来对接数据库db2的

    其中test_app这个应用主要用来实现业务逻辑的

                 django使用多个数据库实现

  第二步:创建 应用app 和 数据库之间的映射关系

    在settings.py 文件夹中设置 DATABASE_APPS_MAPPING 的字典,里面主要是配置 应用app 和数据库的对应关系

DATABASE_APPS_MAPPING = {
    "db1_app": "db1",   # db1_app 对应 db1 数据库
    "db2_app": "db2"    # db2_app 对应 db2 数据库
}

  第三步:创建数据库路由

    在项目的主文件夹即 settings.py 的同目录下创建一个 database_router.py 文件,该文件的作用就是给不同应用app 配置不同的数据库。

# _*_ coding:utf-8 _*_
# @Time : 2023/4/20 5:37 下午

from django.conf import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
print('DATABASE_MAPPING = {}'.format(DATABASE_MAPPING))

class DatabaseAppsRouter(object):

    # 设置 应用app 读取时数据库的设置
    def db_for_read(self, model, **hints)if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
        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

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure that apps only appear in the related database.
        根据app_label的值只在相应的数据库中创建一个表,如果删除该def或
        不指定过滤条件,则一个Model会在每个数据库里都创建一个表。
        """
        if db in DATABASE_MAPPING.values():return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        return None

  第四步:在setting.py中配置 DATABASE_ROUTERS 指定自由路由文件:

#test_django为项目名,database_router为路由文件名,DatabaseAppsRouter为路由中创建的类名
DATABASE_ROUTERS = ['django_db_demo.database_router.DatabaseAppsRouter']

  第五步:创建model类

    说明:model 可以根据需要卸载任何一个应用app的model.py文件中,也可以分散写在多个应用的model.py中,这个根据自己的需要即可,但是如何推荐一定要在model类的Meta中指定app_label。不然会全部将表创建到default数据库中

from django.db import models

class SqliteModel(models.Model):
    """帐号和用户关联"""

    sqlite_name = models.CharField(max_length=20)
    class Meta:
        # 当前这个 SqliteModel 定义的数据库的表将会创建在test_app 对应的default 数据库中
        app_label = "test_app"      # 当有多个数据库链接的时候,要通过app_label 来区分这个model对应那个数据库
   
class Db1Model(models.Model):
    """帐号和用户关联"""

    db1_name = models.CharField(max_length=20)
    class Meta:
        # 当前这个Db1Model 定义的数据库的表将会创建在 db1_app 对应的 db1 数据库中
        app_label = "db1_app"        # 当有多个数据库链接的时候,要通过app_label 来区分这个model对应那个数据库
       
class Db2Model(models.Model):
    """帐号和用户关联"""

    db2_name = models.CharField(max_length=20)
    class Meta:
        # 当前这个Db2Model 定义的数据库的表将会创建在 db2_app 对应的 db1 数据库中
        app_label = "db2_app"       # 当有多个数据库链接的时候,要通过app_label 来区分这个model对应那个数据库
      

  

  第六步:数据迁移

python3 manage.py makemigrations  
python3 manage.py migrate --database=default   # 当有多个数据库,需要迁移多次
python3 manage.py migrate --database=db1
python3 manage.py migrate --database=db2 

  第七步:查看迁移:

    model对应的表,分别迁移到不同的数据库成功,剩下的增删改查的就正常引入model对象即可,这样就实现了,不同的model对象,对应不用数据库的表。

    django使用多个数据库实现

第五步:总结

  1. 创建多个数据库连接设置
  2. 创建多个数据与应用app的映射关系
  3. 创建数据库路由
  4. 创建model类的时候置指明app_label,即这个model是属于那个app,从而觉得迁移到那个数据库

原文链接:https://www.cnblogs.com/Se7eN-HOU/p/17339885.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django使用多个数据库实现 - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • python实现一个简单的ping工具方法

    当我们需要测试网络连通性时,通常可以使用ping命令来测试。但有时我们需要在python程序中实现ping命令的功能。下面是一个简单的实现方法。 使用第三方库ping3 在Python中,有一个名为ping3的第三方库,可以用于模拟ping命令的功能。使用该库的示例如下: import ping3 response_time = ping3.ping(‘ww…

    python 2023年5月19日
    00
  • python实现自动重启本程序的方法

    要实现Python程序的自动重启功能,主要利用Python的os和sys模块,以及subprocess库中的Popen方法。 以下是步骤: 1. 导入模块 为了实现自动重启功能,我们需要使用Python中的os、sys模块,以及subprocess库中的Popen方法。所以首先需要导入这些模块: import os import sys import sub…

    python 2023年5月19日
    00
  • Python实现树莓派摄像头持续录像并传送到主机的步骤

    下面是“Python实现树莓派摄像头持续录像并传送到主机的步骤”的完整攻略: 准备工作 确保树莓派摄像头已经正确安装。 在树莓派上安装Python开发环境,并安装picamera包。 bash sudo apt-get update sudo apt-get install python3-picamera 录像并传送到主机的步骤 使用Python的pica…

    python 2023年5月30日
    00
  • Python使用graphviz画流程图过程解析

    Python使用graphviz画流程图过程解析 Graphviz是一种流程图绘制工具,可以用于绘制各种类型的图表,包括流程图、组织结构图、时序图等。在Python中,我们可以使用graphviz库来绘制流程图。本文将详细讲解如何使用Python和graphviz库来绘制流程图,并提供两个示例。 安装graphviz 在使用graphviz库之前,我们需要先…

    python 2023年5月15日
    00
  • Python小工具之消耗系统指定大小内存的方法

    当我们需要测试 Python 程序的性能时,可以通过消耗系统指定大小的内存来模拟处理大数据的场景,并测试程序的稳定性和性能。本文将详细讲解 Python 小工具之消耗系统指定大小内存的方法,具体如下: 1. 通过分配大量字符串来消耗内存 可以通过分配大量的字符串来消耗系统指定大小内存。以下是示例代码: def consume_memory(size): &q…

    python 2023年6月3日
    00
  • Python实现的计算马氏距离算法示例

    Python实现的计算马氏距离算法示例 马氏距离是一种常用的距离度量方法,它可以用于计算两个随机向量之间的距离。在Python中,可以使用NumPy库实现计算马氏距离算法。本文将详细讲解Python实现计算马氏距离算法的完整攻略,包括算法原理、Python实现过程和示例。 算法原理 马氏距离是一种常用的距离度量方法,可以用于计算两个随机向量之间的距离。马氏距…

    python 2023年5月14日
    00
  • 深入理解python中的atexit模块

    当我们编写程序时,通常需要在程序正常终止或突然终止时执行一些清理或日志记录等操作。Python中的atexit模块可以帮助我们实现这些操作。本文将介绍atexit模块的使用方法和原理,包括以下内容: atexit模块是什么? atexit的使用方法 atexit原理分析 1. atexit模块是什么? Python中的atexit模块是一个标准库,它提供了一…

    python 2023年5月19日
    00
  • Pytest运行及其控制台输出信息

    Pytest是一个流行的Python测试框架,它可以轻松地编写简单和复杂的测试,提供了丰富的断言、插件机制以及丰富的控制台输出信息,可以有效地将测试结果以易懂的方式显示给用户。以下是Pytest运行及其控制台输出信息的完整攻略: 安装Pytest 要使用Pytest,需要先安装它。可以使用以下命令来安装: pip install pytest 编写测试脚本 …

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部