初衷
為了讓不同業(yè)務(wù)的數(shù)據(jù)分離,落到不同的庫,使用django
連接多個(gè)數(shù)據(jù)庫。
設(shè)置
# settings.py
DATABASES = {
"default": {},
"users": {
"NAME": "user_data",
"ENGINE": "django.db.backends.mysql",
"USER": "mysql_user",
"PASSWORD": "superS3cret",
},
"customers": {
"NAME": "customer_data",
"ENGINE": "django.db.backends.mysql",
"USER": "mysql_cust",
"PASSWORD": "veryPriv@ate",
},
}
-
Django
使用default
數(shù)據(jù)庫,如果沒有其他選擇 -
default
可以沒有,但是必須設(shè)置一個(gè)空字典
同步
設(shè)置多個(gè)數(shù)據(jù)庫,需要同步多次。這里比較麻煩。
python3 manage.py
python manage.py migrate message。# 遷移到default庫
python manage.py migrate message --database=message_db
遷移將會(huì)把所有model的所有表鏡像的遷移到兩個(gè)庫,自帶的指令不要指望一次遷移所有model分表存儲(chǔ)
Database Routing
class MessageRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
route_app_labels = { "message", "data"}
def db_for_read(self, model, **hints):
"""
Attempts to read auth and contenttypes models go to message_db.
"""
if model._meta.app_label in self.route_app_labels:
return "message_db"
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth and contenttypes models go to message_db.
"""
if model._meta.app_label in self.route_app_labels:
return "message_db"
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth or contenttypes apps is
involved.
"""
if (
obj1._meta.app_label in self.route_app_labels
or obj2._meta.app_label in self.route_app_labels
):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the auth and contenttypes apps only appear in the
'message_db' database.
"""
if app_label in self.route_app_labels:
return db == "message_db"
return None
可以通過django的路徑中間件來對(duì)數(shù)據(jù)庫的讀、寫、遷移權(quán)限進(jìn)行設(shè)置。
需要在settings.py中添加
DATABASE_ROUTERS = ["path.to.MessageRouter"]
# my instance is ["message.MessageRouter.MessageRouter"]
fake遷移
如果遇到不希望遷移到A庫,但會(huì)一直提示的情況,可以使用fake遷移
py manage.py migrate <app> --fake
總結(jié)
數(shù)據(jù)分庫存儲(chǔ)(也稱為數(shù)據(jù)庫分片或數(shù)據(jù)庫分區(qū))是一種將大型數(shù)據(jù)庫分解為更小、更易于管理的組件(稱為“分片”或“分區(qū)”)的策略。這種方法有多個(gè)潛在好處:文章來源:http://www.zghlxwxcb.cn/news/detail-670240.html
- 提高性能和響應(yīng)時(shí)間
讀寫分離: 通過將讀操作和寫操作分配到不同的數(shù)據(jù)庫或分片上,可以提高系統(tǒng)的吞吐量和響應(yīng)時(shí)間。
并行處理: 分庫允許多個(gè)查詢和事務(wù)并行執(zhí)行在不同的數(shù)據(jù)庫或分片上,從而提高性能。 - 擴(kuò)展性
水平擴(kuò)展: 當(dāng)數(shù)據(jù)量和訪問量增加時(shí),可以通過添加更多的數(shù)據(jù)庫或分片來輕松擴(kuò)展系統(tǒng),而不是替換現(xiàn)有的硬件(這稱為垂直擴(kuò)展)。 - 簡化備份和恢復(fù)
更快的備份: 小的數(shù)據(jù)庫分片更容易和更快地備份。
局部恢復(fù): 如果一個(gè)分片出現(xiàn)問題,你可以只恢復(fù)那個(gè)特定的分片,而不影響整個(gè)系統(tǒng)。 - 高可用性和故障轉(zhuǎn)移
冗余: 數(shù)據(jù)可以在多個(gè)分片或數(shù)據(jù)庫中進(jìn)行冗余存儲(chǔ),從而提高數(shù)據(jù)的可用性。
故障隔離: 如果一個(gè)數(shù)據(jù)庫或分片出現(xiàn)問題,它不會(huì)影響到其他分片,從而減少了故障的影響范圍。 - 數(shù)據(jù)局部性
優(yōu)化查詢: 數(shù)據(jù)分片可以根據(jù)應(yīng)用的訪問模式來進(jìn)行優(yōu)化,例如,通過地理位置或時(shí)間來分片,從而提高查詢性能。 - 管理和維護(hù)
分布式管理: 小的、分散的數(shù)據(jù)庫通常更容易管理和維護(hù)。
版本控制和更新: 可以逐個(gè)更新或修改數(shù)據(jù)庫分片,而不是一次性更新整個(gè)數(shù)據(jù)庫。 - 成本效益
硬件成本: 通過使用分庫,你可以在廉價(jià)的 commodity 硬件上分布式地存儲(chǔ)和處理數(shù)據(jù),而不是依賴單一、昂貴的高性能服務(wù)器。
盡管數(shù)據(jù)分庫存儲(chǔ)有很多好處,但它也帶來了一些挑戰(zhàn),如數(shù)據(jù)一致性、復(fù)雜的查詢和事務(wù)處理等。因此,在決定采用這種策略之前,需要仔細(xì)評(píng)估應(yīng)用的需求和特點(diǎn)。
但是會(huì)比較麻煩,每次都要遷移兩個(gè)數(shù)據(jù)庫。文章來源地址http://www.zghlxwxcb.cn/news/detail-670240.html
到了這里,關(guān)于Django連接多個(gè)數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!