Django 數據庫讀寫分離 分庫分表


多個數據庫

配置:

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, 'db.sqlite3'),
    },
}

  • 寫入到 指定數據庫
python manage.py  makemigrations   
python manage.py migrate   -- database db2  

使用

讀寫分離

  • 手動

s = models.Student.objects.using('default').all()

models.Student.objects.using('db2').create(name='xxx',)
  • 自動

  • settings中配置

    DATABASE_ROUTERS = ['myrouter.Router']

# 創建 myrouter.py 文件
# myrouter
class Router:
    def db_for_read(self, model, **kwargs):
        return 'default'

    def db_for_write(self, model, **kwargs):
        return 'db2'

一主多從

# 一主多從
import random

class Router:
    def db_for_read(self, model, **kwargs):
        return random.choices(['db1', 'db2', 'db3'])

    def db_for_write(self, model, **kwargs):
        return 'db'

分庫分表

# 分庫分表  不同的app 使用不同的數據庫

# app01  db1     app02 db2

class Router:
    def db_for_read(self, model, **kwargs):

        if model._meta.app_label == 'app01':
            return 'db1 '
        elif model._meta.app_label == 'app02':
            return 'db2'

    def db_for_write(self, model, **kwargs):
        if model._meta.app_label == 'app01':
            return 'db1 '
        elif model._meta.app_label == 'app02':
            return 'db2'

執行原生sql

from django.db import connection, connections
# cursor = connection.cursor()
cursor = connections['db2'].cursor()
cursor.execute("""SELECT * from app01_student """, )
row = cursor.fetchall()
print(row)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM