Django连接数据库并实现读写分离过程解析

yizhihongxing

下面我来详细讲解“Django连接数据库并实现读写分离过程解析”的完整攻略。

什么是读写分离

读写分离指的是在一个数据库中,将读写操作分别放在不同的数据库实例上进行。因为读和写的负载不同,如果两者在同一台数据库实例上执行,那么会很容易出现读写冲突,导致系统压力过大,从而影响系统的稳定性和可用性。因此我们要将读写操作分离,以便更好地优化数据库的性能。

Django连接数据库的方式

Django连接数据库的方式有两种:一种是使用Django自带的ORM,另一种是使用原生的SQL语句。

使用Django自带的ORM连接数据库

# settings.py中定义数据库连接信息
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  
        'NAME': 'db',                            # 数据库名
        'USER': 'user',                          # 用户名
        'PASSWORD': 'password',                  # 密码
        'HOST': '127.0.0.1',                      # 数据库地址
        'PORT': '3306',                          # 数据库端口
    },
}

# models.py定义数据库表
from django.db import models

class Book(models.Model):
    name = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    date_published = models.DateField()

# views.py中对数据库进行操作
from .models import Book

def create_book(request):
    book = Book(name='Django Book', author='John', date_published='2021-01-01')
    book.save()

这是使用Django自带的ORM连接数据库的方式。我们首先在settings.py文件中定义数据库连接信息,然后在models.py文件中定义数据库表。在views.py文件中可以通过import语句导入相关的models文件,以对数据库进行操作。具体的操作方式可以参考官方文档。

使用原生的SQL语句连接数据库

# settings.py中定义数据库连接信息
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
}

# views.py中使用原生SQL语句进行操作
from django.db import connections

def create_book(request):
    with connections['default'].cursor() as cursor:
        query = "INSERT INTO app_book (name, author, date_published) VALUES (%s, %s, %s)"
        cursor.execute(query, ('Django Book', 'John', '2021-01-01'))

这是使用原生的SQL语句连接数据库的方式。我们同样需要在settings.py文件中定义数据库连接信息,然后在views.py文件中通过django.db.connections获取默认数据库连接,并在with语句中定义游标,以执行SQL语句对数据库进行操作。

Django实现读写分离的方式

Django实现读写分离的方式有两种:一种是通过使用第三方库django-mysql-replication实现,另一种是通过自定义数据库路由实现。

通过使用django-mysql-replication实现

django-mysql-replication是一个第三方库,可以通过它来实现Django的读写分离。它基于MySQL的binlog日志,实时复制数据库,并同步到多个从库上,从而实现读写分离。

安装django-mysql-replication

通过pip命令安装:

pip install django-mysql-replication

配置django-mysql-replication

在settings.py中添加以下配置:

DATABASE_ROUTERS = ['mysql_router.MasterSlaveRouter']
DJANGO_MYSQL_REPLICATION = {
    'MASTER': {
        'host': '127.0.0.1',
        'port': '3306',
        'user': 'user',
        'password': 'password',
        'server_id': '1',
        'binlog_stream': 'MASTER',
        'blocking': False
    },
    'SLAVES': [
        {
            'host': '127.0.0.1',
            'port': '3307',
            'user': 'user',
            'password': 'password',
            'server_id': '2',
            'blocking': False
        },
        {
            'host': '127.0.0.1',
            'port': '3308',
            'user': 'user',
            'password': 'password',
            'server_id': '3',
            'blocking': False
        },
    ],
}

这里我们定义了2个从库,分别监听了3307和3308端口。

自定义数据库路由

在app目录下创建mysql_router.py文件,定义MasterSlaveRouter类,继承自django.db.routers.BaseRouter,重载db_for_read和db_for_write方法。

class MasterSlaveRouter:
    def db_for_read(self, model, **hints):
        return 'slave_db'

    def db_for_write(self, model, **hints):
        return 'master_db'

这里我们定义了一种读写分离的方式,读操作走从库,写操作走主库。

控制数据库的读写操作

在操作数据库时,可以通过read_from指定读操作应该从哪个数据库中读取数据。

from django.db import connections

# 从数据库中随机读取数据
def read_book(request):
    with connections['slave_db'].cursor() as cursor:
        cursor.execute("SELECT id, name, author, date_published FROM app_book ORDER BY RAND() LIMIT 1")
        row = cursor.fetchone()
        book = {
            "id": row[0],
            "name": row[1],
            "author": row[2],
            "date_published": row[3]
        }
        return JsonResponse(book)

# 写数据到主库
def create_book(request):
    with connections['master_db'].cursor() as cursor:
        query = "INSERT INTO app_book (name, author, date_published) VALUES (%s, %s, %s)"
        cursor.execute(query, ('Django Book', 'John', '2021-01-01'))
        return HttpResponse('Create book success')

这里我们可以通过read_from指定从哪个数据库中进行读操作,同时在create_book函数中也可以指定只从主库中写入数据。

通过自定义数据库路由实现

上面我们介绍了使用第三方库来实现读写分离的方式,而现在我们来介绍如何通过自定义数据库路由来实现读写分离。

自定义数据库路由

我们在app目录下的mysql_router.py文件中自定义MasterSlaveRouter类:

class MasterSlaveRouter:
    def db_for_read(self, model, **hints):
        return 'slave_db'

    def db_for_write(self, model, **hints):
        return 'master_db'

    def allow_relation(self, obj1, obj2, **hints):
        db_obj1 = getattr(obj1, '_state').db or 'default'
        db_obj2 = getattr(obj2, '_state').db or 'default'
        if db_obj1 == 'master_db' or db_obj2 == 'master_db':
            return False
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if db == 'master_db':
            return app_label == 'app'
        elif app_label == 'app':
            return False
        return None

这里我们定义了一种读写分离的方式,读操作走从库,写操作走主库,并且定义了allow_relation和allow_migrate方法,分别用于限制关联表和进行数据迁移的操作。

配置多个数据库连接信息

在settings.py中定义多个数据库连接信息:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
    'master_db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
    'slave_db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '3307',
    },
}

这里我们定义了3个不同的数据库连接信息,用于连接主库、从库以及默认库。

控制数据库的读写操作

在操作数据库时,可以通过using指定读写操作应该从哪个数据库中进行。

from app.models import Book

# 从数据库中随机读取数据
def read_book(request):
    book = Book.objects.using('slave_db').order_by('?').first()
    return JsonResponse({
        "id": book.id,
        "name": book.name,
        "author": book.author,
        "date_published": book.date_published,
    })

# 写数据到主库
def create_book(request):
    book = Book(name='Django Book', author='John', date_published='2021-01-01')
    book.save(using='master_db')
    return HttpResponse('Create book success')

这里我们可以通过using指定从哪个数据库中进行读写操作。

以上就是关于Django连接数据库并实现读写分离的完整攻略,包含了两种实现方式以及相关示例。希望您能够掌握其中的要点,顺利进行项目的开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django连接数据库并实现读写分离过程解析 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django 类视图的使用方法详解

    Django 类视图的使用方法详解 Django 是一个开源的 Python Web 框架,使用 Django 可以方便地构建复杂的 Web 应用程序。类视图是 Django 中非常重要的一种视图方式,在本文中,我们将详细讲解 Django 类视图的使用方法。 什么是 Django 类视图 类视图是 Django 中的一种功能强大的视图方式,它可以让我们更加…

    Django 2023年5月16日
    00
  • django之登陆验证,cookie,session

    一:会话技术:       1:什么是会话跟踪技术:     首先我们应该知道,什么是会话。当浏览器(客户端)第一次访问某个网站的时候(服务器)。该浏览器便和服务器建立了单独的会话。直到浏览器关闭或服务器断开。但是一个网站有许多请求,如/login/,/index/等,而http协议是一种无状态的协议,一次请求一次链接,并不会保存状态信息。而我们一些信息,常…

    Django 2023年4月12日
    00
  • django orm操作(1)

    MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动 ORM是“对象-关系-映射”的简称。 View Code 回到顶部 单表操作 创建表 1  创建模型 创建名为book的ap…

    Django 2023年4月13日
    00
  • Django ORM必会13条之外的查询方法

    # 价格 大于 小于 大于等于 小于等于 filter(price__gt=’90’) # 筛选出大于90 filter(price__lt=’90’) # 筛选出小于90 filter(price_gte=’90’) # 筛选出大于等于90的 filter(price_lte=’90’) # 筛选出小于等于90的 # 存在与几个条件中 filter(pri…

    Django 2023年4月9日
    00
  • django正续或者倒序查库实例

    下面是针对 Django 的正序或倒序查库实例的攻略和示例: 1. 正序查库实例 1.1. 数据库模型 首先,我们需要创建一个数据模型,例如,假设我们想创建一个用于存储书籍信息的 Book 数据模型,我们可以如下定义: from django.db import models class Book(models.Model): title = models.…

    Django 2023年5月16日
    00
  • Django MySQL 数据库连接

    Django 1.11 官方文档 常规说明 数据库连接 CONN_MAX_AGE 定义数据库连接时限(ALL) default:0 保存在每个请求结束时关闭数据库连接的历史行为。None:保持长连接Other:xx 单位秒 连接管理 Django连接发生在每次请求时,如果没有可用连接便主动建立连接,如果限制了连接时间的话。 警告 每个线程包含自己的数据库连接…

    Django 2023年4月13日
    00
  • 利用Python web框架Django实现py-faster-rcnn demo实例

    —作者疆,未经允许,严禁转载,违权必究— —欢迎指正,需要源码和文件可站内私信联系— ———–点击此处链接至博客园原文———–   功能说明:利用Python web框架Django,将faster-rcnn的demo程序以网页形式展现出来,简而言之是基于B-S架构的编程,直观地以网页形式展示目标检测的功能。 运行…

    Django 2023年4月13日
    00
  • django drf框架自带的路由及最简化的视图

    针对该话题,我介绍一下关于Django DRF框架自带的路由和最简化的视图的完整攻略。 一、Django DRF框架自带的路由 在Django DRF框架中,提供了多种路由匹配方法,其中最常用的是DRF自带的路由匹配器。 首先,需要导入include和default-router两个路由相关的模块: from django.urls import path,…

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