欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

前言

當(dāng)一個(gè)項(xiàng)目當(dāng)中有大量的數(shù)據(jù)的時(shí)候,你所有的IO操作都在一個(gè)數(shù)據(jù)庫(kù)中操作,會(huì)造成項(xiàng)目的性能的降低。如果你能對(duì)項(xiàng)目中的數(shù)據(jù)進(jìn)行讀寫(xiě)分離的話(huà),那么將大大提高你項(xiàng)目的性能。而Django自帶的機(jī)制也對(duì)此提供了支持。我們可以簡(jiǎn)單的操作一下。(當(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ù)器的用戶(hù)名
    '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ù)庫(kù)遷移了

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

手動(dòng)讀寫(xiě)分離

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

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('寫(xiě)成功')
def read(request):
  obj = models.User.objects.filter(id=1).using('db2').first()
  return HttpResponse('讀成功')

自動(dòng)讀寫(xiě)分離

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

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

定義數(shù)據(jù)庫(kù)路由類(lèi)

class MasterSlaveDBRouter(object):
  """數(shù)據(jù)庫(kù)主從讀寫(xiě)分離路由"""
 
  def db_for_read(self, model, **hints):
    """讀數(shù)據(jù)庫(kù)"""
    return "slave"
 
  def db_for_write(self, model, **hints):
    """寫(xiě)數(shù)據(jù)庫(kù)"""
    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ù)庫(kù)路由,比如對(duì)于讀操作,Django將會(huì)循環(huán)所有路由中的db_for_read()方法,直到其中一個(gè)有返回值,然后使用這個(gè)數(shù)據(jù)庫(kù)進(jìn)行當(dāng)前操作。

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

相關(guān)文章

最新評(píng)論