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

數據庫遷移命令:
    python manager.py migrate --database db2

讀寫分離

1. 手動的方式

1) 寫入數據庫 
use usingmodels.Student.objects.using('db2').create(name='xxxx')

2) 讀取數據庫
ret = models.Student.objects.using('default').all()

3) 保存時指定數據庫
for i in ret:    
	i.name = 'ran'  # 在內存中進行修改
	i.save(using='default')  # 保存在 default 數據庫
1. 自動配置, 在app下創建router.py

class Router:

	# 配置讀數據庫
    def db_for_read(self, model, **kwargs):
        return 'default'
	
	# 配置寫數據庫
    def db_for_write(self, model, **kwargs):
        return 'db2'

2. 在settings.py配置
	DATABASE_ROUTERS = ['app01.router.Router']

一主多從

1. 自動配置, 在app下創建router.py

import random

class Router:

	# 配置讀數據庫
    def db_for_read(self, model, **kwargs):
        return random.choice(['db1', 'db2', 'db3'])
	
	# 配置寫數據庫
    def db_for_write(self, model, **kwargs):
        return 'default'

2. 在settings.py配置
	DATABASE_ROUTERS = ['app01.router.Router']

分庫分表

前提:
    app01的表放在db1
    app02的表放在db2

1. 自動配置, 在app下創建router.py

class Router:
    def db_for_read(self, model, **kwargs):
        label = model._meta.app_label

        if label == 'app01':
            return 'db1'
        elif label == 'app02':
            return 'db2'

    def db_for_write(self, model, **kwargs):
        label = model._meta.app_label

        if label == 'app01':
            return 'db1'
        elif label == 'app02':
            return 'db2'
        
2. 在settings.py配置
	DATABASE_ROUTERS = ['app01.router.Router']
    
3.  model._meta.app_label    # 獲取app的名稱
	model._meta.model_name   # 獲取model類的名稱

Django執行原生SQL

1. extra(): 結果集修改器,一種提供額外查詢參數的機制, 依賴 model
用在where后:
	Book.objects.filter(publisher_id="1").extra(where=["title='python'"])    

用在select后
	Book.objects.filter(u_id="1").extra(select={"count":"select count(*) from book"})

2. raw() 方法: 執行原始SQL並返回模型, 依賴 model 多余查詢
book_obj = models.Book.objects.raw("select * from book")
for item in book_obj:
    print(item.title)
    
3. 自定義SQL, 利用游標執行, 不依賴model

from django.db import connection

cursor = connection.cursor()

# 查詢
cursor.execute("select * from users")
# 插入
cursor.execute("insert into users (name) values ('ran')")
# 更新
cursor.execute("update users set name='mei' where id=1")
# 刪除
cursor.execute("delete from users where name='meng'")
# 返回一行數據
raw = cursor.fetchone()
# 返回所有
raw = cursor.fetchall()


免責聲明!

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



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