多個數據庫
配置:
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)