亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Django連接數(shù)據(jù)庫并實(shí)現(xiàn)讀寫分離過程解析

 更新時(shí)間:2019年11月13日 10:17:32   作者:Sean_Yang  
這篇文章主要介紹了Django連接數(shù)據(jù)庫并實(shí)現(xiàn)讀寫分離過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Django連接數(shù)據(jù)庫并實(shí)現(xiàn)讀寫分離過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

當(dāng)一個(gè)項(xiàng)目當(dāng)中有大量的數(shù)據(jù)的時(shí)候,你所有的IO操作都在一個(gè)數(shù)據(jù)庫中操作,會造成項(xiàng)目的性能的降低。如果你能對項(xiàng)目中的數(shù)據(jù)進(jìn)行讀寫分離的話,那么將大大提高你項(xiàng)目的性能。而Django自帶的機(jī)制也對此提供了支持。我們可以簡單的操作一下。(當(dāng)然數(shù)據(jù)的同步還是需要運(yùn)維同志的協(xié)助)

修改配置文件

Django默認(rèn)的是default,我們按照它的格式直接添加一個(gè)新的配置:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  },
  'db2': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
  }
}

當(dāng)然,如果你不想使用默認(rèn)的sqlite3,想使用mysql還需要自己進(jìn)行一下配置

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'HOST': '127.0.0.1', # 主服務(wù)器的運(yùn)行ip
    'PORT': 3306,  # 主服務(wù)器的運(yùn)行port
    'USER': 'django', # 主服務(wù)器的用戶名
    'PASSWORD': 'django', # 主服務(wù)器的密碼
    'NAME': 'djangobase'  # 數(shù)據(jù)表名
  },
  'slave': {
    'ENGINE': 'django.db.backends.mysql', 
    'HOST': '127.0.0.1',
    'PORT': 8306,
    'USER': 'django_slave',
    'PASSWORD': 'django_slave',
    'NAME': 'djangobase_slave'
  }
}  

在項(xiàng)目目錄下的__init__文件中添加以下代碼,將數(shù)據(jù)連接方式改為pymysql

import pymysql
pymysql.install_as_MySQLdb()

將數(shù)據(jù)配置修改完之后就可以在models.py文件當(dāng)中創(chuàng)建表,接下里就可以進(jìn)行數(shù)據(jù)庫遷移了

python manage.py makemigrations # 在migrations文件夾下生成記錄
python manage.py migrate --database default # 默認(rèn)可以不寫參數(shù)
python manage.py migrate --database db2 # 在從庫再遷移一次,就可以在上面建立相同的表

手動(dòng)讀寫分離

在遇到數(shù)據(jù)庫相關(guān)操作的話,需要手動(dòng)指定要使用的相應(yīng)數(shù)據(jù)庫,不需要進(jìn)行多余的配置,但是,當(dāng)你數(shù)據(jù)的讀寫操作過于頻繁的時(shí)候,這個(gè)方法就會略顯繁瑣。

from django.shortcuts import render, HttpResponse
from app001 import models
# Create your views here.
def write(request):
  models.User.objects.using('default').create(name='張三', pwd='123', phone=1234)
  return HttpResponse('寫成功')
def read(request):
  obj = models.User.objects.filter(id=1).using('db2').first()
  return HttpResponse('讀成功')

自動(dòng)讀寫分離

通過配置數(shù)據(jù)庫路由,來自動(dòng)實(shí)現(xiàn)讀寫分離,這樣就不需要每次讀寫都手動(dòng)指定數(shù)據(jù)庫。

在項(xiàng)目的app中創(chuàng)建db_router.py文件,并在該文件中定義一個(gè)數(shù)據(jù)庫路由類,用來進(jìn)行讀寫分離,這個(gè)類最多提供四個(gè)方法,分別是:db_for_read、db_for_write、allow_relation、allow_migrate,以下只寫了三個(gè)。

定義數(shù)據(jù)庫路由類

class MasterSlaveDBRouter(object):
  """數(shù)據(jù)庫主從讀寫分離路由"""
 
  def db_for_read(self, model, **hints):
    """讀數(shù)據(jù)庫"""
    return "slave"
 
  def db_for_write(self, model, **hints):
    """寫數(shù)據(jù)庫"""
    return "default"
 
  def allow_relation(self, obj1, obj2, **hints):
    """是否運(yùn)行關(guān)聯(lián)操作"""
    return True  

配置Router

在settings.py中指定DATABASE_ROUTERS

DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]

可以指定多個(gè)數(shù)據(jù)庫路由,比如對于讀操作,Django將會循環(huán)所有路由中的db_for_read()方法,直到其中一個(gè)有返回值,然后使用這個(gè)數(shù)據(jù)庫進(jìn)行當(dāng)前操作。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論