日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

django全自动分库分表(横向)

發(fā)布時(shí)間:2024/1/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django全自动分库分表(横向) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

django全自動(dòng)分庫分表

期待大神指點(diǎn)方法的不足之處或者其他更好的方法
由于當(dāng)前項(xiàng)目目前只需要實(shí)現(xiàn)寫,所以這里也沒有考慮讀寫分離。如果要考慮讀寫分離,則在路由處進(jìn)行設(shè)置即可。

分庫原理

django在初始化的時(shí)候,從自己的數(shù)據(jù)庫管理服務(wù)器獲取當(dāng)前的所有數(shù)據(jù)庫,以及數(shù)據(jù)庫的入庫規(guī)則,在獲取數(shù)據(jù)的時(shí)候,根據(jù)數(shù)據(jù)字段值動(dòng)態(tài)生成Model,并動(dòng)態(tài)保存到指定的數(shù)據(jù)庫中。
動(dòng)態(tài)生成的Model不僅能夠?qū)崿F(xiàn)分庫,還能實(shí)現(xiàn)動(dòng)態(tài)橫向分表,牛逼吧。
一句話:通過動(dòng)態(tài)路由分庫,通過動(dòng)態(tài)model分表

1 從數(shù)據(jù)庫管理服務(wù)器獲取設(shè)置

settings.py #盡量放在靠前 GROUP_ID_TO_DATABASE={}#記錄對(duì)應(yīng)的動(dòng)態(tài)model需要保存到哪個(gè)數(shù)據(jù)庫 # # Application definition def get_db_setting():"""從數(shù)據(jù)庫管理服務(wù)器獲取數(shù)據(jù)庫設(shè)置和數(shù)據(jù)標(biāo)對(duì)應(yīng)的數(shù)據(jù)庫db_setting_url:連接數(shù)據(jù)庫管理服務(wù)器的地址django_info:當(dāng)前配置的服務(wù)器的信息,必須為一個(gè)不重復(fù)的固定值:return:"""import requestsdjango_info={'django_device_id':'',#該服務(wù)器的設(shè)備id,建議從配置文件讀取,且各個(gè)django服務(wù)器之間不要重復(fù)}r=requests.post(url=db_setting_url,data=django_info)return r.json()DATABASES,GROUP_ID_TO_DATABASE=get_db_setting()

2 創(chuàng)建數(shù)據(jù)庫表

該model在collect這個(gè)app里面

#對(duì)應(yīng)model.py里面的model #MyModel是我自定義的一個(gè)抽象基類model,你可以直接使用models.Model class BaseGetFaceRecord(MyModel):"""入庫記錄基礎(chǔ)的入庫記錄,該model為abstract=True的model,在之后會(huì)進(jìn)行繼承并創(chuàng)建真正需要的數(shù)據(jù)庫"""collected_face = models.ForeignKey(BaseCollectFace, on_delete=models.CASCADE, verbose_name="對(duì)應(yīng)人臉信息")group_id = models.CharField(max_length=128, verbose_name="人臉庫")camera_id = models.CharField(max_length=128, verbose_name="抓拍相機(jī)ID")arrived_time = models.DateTimeField(max_length=10, verbose_name="抓拍時(shí)間戳")person_id = models.CharField(max_length=128, verbose_name="人臉I(yè)D(faceToken)")first_arrive_time = models.DateTimeField(max_length=10, verbose_name="首次到訪時(shí)間戳")class Meta:abstract = Trueverbose_name = "人臉照片庫"verbose_name_plural = verbose_nameclass BaseGetFaceRecord(MyModel):"""入庫記錄基礎(chǔ)的入庫記錄,該model為abstract=True的model,在之后會(huì)進(jìn)行繼承并創(chuàng)建真正需要的數(shù)據(jù)庫"""collected_face = models.ForeignKey(BaseCollectFace, on_delete=models.CASCADE, verbose_name="對(duì)應(yīng)人臉信息")group_id = models.CharField(max_length=128, verbose_name="人臉庫")camera_id = models.CharField(max_length=128, verbose_name="抓拍相機(jī)ID")arrived_time = models.DateTimeField(max_length=10, verbose_name="抓拍時(shí)間戳")person_id = models.CharField(max_length=128, verbose_name="人臉I(yè)D(faceToken)")first_arrive_time = models.DateTimeField(max_length=10, verbose_name="首次到訪時(shí)間戳")class Meta:abstract = Trueverbose_name = "人臉照片庫"verbose_name_plural = verbose_nameclass CreateGetFaceRecordModel(object):"""動(dòng)態(tài)創(chuàng)建動(dòng)態(tài)創(chuàng)建人臉庫的類主要用來提供靜態(tài)方法也可以不寫成類"""@staticmethoddef __get_GetFaceRecord_model(group_id: str):"""創(chuàng)建FaceRecord模型:param group_id:人臉庫名稱:return: FaceRecord"""#要連接的數(shù)據(jù)表,table_name = 'getfacerecord_%s' % str(group_id)#這里會(huì)重新設(shè)置創(chuàng)建的model的名字,每個(gè)model名字都是動(dòng)態(tài)的,不是GetFaceRecordclass Metaclass(models.base.ModelBase):def __new__(cls, name, bases, attrs):name += group_id # 這是Model的name.return models.base.ModelBase.__new__(cls, name, bases, attrs)# 注意繼承的順序class GetFaceRecord(BaseAlgoFace, metaclass=Metaclass):@staticmethoddef is_exists(table_name1):"""判斷這個(gè)表是否已經(jīng)在數(shù)據(jù)庫:param table_name1::return:"""table_name1 = 'getfacerecord_' + table_name1return table_name1 in connection.introspection.table_names()class Meta:abstract = Falsedb_table = table_nameapp_label="collect"return GetFaceRecord@staticmethoddef create_GetFaceRecord(group_id: str):"""注冊(cè)GetFaceRecord模型:param group_id: 人臉庫名稱:return: GetFaceRecord"""try:# cls = apps.get_model('__main__', 'ExcelData_%s' % project_name)# 獲取模型對(duì)應(yīng)的model,如果有的話,第一個(gè)參數(shù)為collect這個(gè)app,第二個(gè)參數(shù)為model的名字# 這里不用__main__是因?yàn)橹髸?huì)考慮到分庫,不同的app會(huì)到不同的庫里cls = apps.get_model('collect', 'GetFaceRecord_%s' % group_id)except LookupError:cls = CreateGetFaceRecordModel.__get_GetFaceRecord_model(group_id)except Exception as e:raise eif not cls.is_exists(group_id):# 將數(shù)據(jù)表創(chuàng)建with connection.schema_editor() as schema_editor:# 創(chuàng)建模型,調(diào)用的應(yīng)該是migrate和makemigrations里面的方法schema_editor.create_model(cls)return clselse:return clsdef get_GetFaceRecord(group_id: str):"""獲取注冊(cè)人臉的人臉庫對(duì)應(yīng)model,但是請(qǐng)注意,如果沒有會(huì)創(chuàng)建該表和該模型,如果有,返回該模型:param group_id:人臉庫信息:return:"""return CreateGetFaceRecordModel.create_GetFaceRecord(group_id)

3 創(chuàng)建數(shù)據(jù)庫路由器

在對(duì)應(yīng)的app里面創(chuàng)建自己的router.py,注意這部分內(nèi)容也應(yīng)該從數(shù)據(jù)庫管理服務(wù)器獲取

""" @version: 1.0 @author: chise @time : 2019/07/24 10:51 """ from MultiAlgorithm.settings import GROUP_ID_TO_DATABASEclass BaseRouter():def db_for_read(self, model, **hints):"""返回對(duì)應(yīng)的數(shù)據(jù)庫名稱:param model::param hints::return:"""if model._meta.label == "base.UserGroup" or model._meta.label == "base.FaceAggregation":return 'default'else:model_name = str(model.__class__.__name__)return GROUP_ID_TO_DATABASE[model_name]def db_for_write(self, model, **hints):if model._meta.label == "base.UserGroup" or model._meta.label == "base.FaceAggregation":return 'default'else:model_name = str(model.__class__.__name__)return GROUP_ID_TO_DATABASE[model_name]def allow_relation(self, obj1, obj2, **hints):"""是否允許通過外鍵訪問??如果應(yīng)該允許obj1和obj2之間的關(guān)系,返回True;如果應(yīng)該阻止這種關(guān)系,返回False;如果路由器沒有意見,返回None。這純粹是一個(gè)驗(yàn)證操作,由外鍵和許多對(duì)許多操作使用,以確定是否應(yīng)該允許兩個(gè)對(duì)象之間存在關(guān)系。:param obj1::param obj2::param hints::return:"""return Truedef allow_migrate(self, db, app_label, model_name=None, **hints):"""是否允許migrate進(jìn)行遷移的驗(yàn)證這里不允許通過migrate的方式將數(shù)據(jù)遷移,數(shù)據(jù)庫表只能在數(shù)據(jù)庫管理器里面進(jìn)行創(chuàng)建:param db::param app_label::param model_name::param hints::return:"""if app_label == 'base':return db == 'base.UserGroup' or db == 'base.UserGroup'return None

至此,就完成了動(dòng)態(tài)的數(shù)據(jù)庫配置

總結(jié)

通過這個(gè)方法,再結(jié)合nginx,就可完成django配置數(shù)據(jù)庫。
注意,這里只是一個(gè)demo,還有很多東西沒有進(jìn)行實(shí)現(xiàn),比如數(shù)據(jù)庫DATABASE設(shè)置的熱更新,如果配置,即可實(shí)現(xiàn)動(dòng)態(tài)添加數(shù)據(jù)庫和增加服務(wù)器配置。
創(chuàng)建路由的介紹可以看這,挺合適:https://www.jb51.net/article/141182.htm

總結(jié)

以上是生活随笔為你收集整理的django全自动分库分表(横向)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜精品久久久久久久99 | 国产一级特黄aaa大片 | 午夜欧美福利 | 亚洲中文字幕一区二区在线观看 | 色男人天堂av | 冲田杏梨av | 麻豆国产在线视频 | 日本少妇色 | 成人在线网站 | 久久久久a | 人善交videos欧美3d动漫 | 毛片视频免费播放 | www.国产区| 成人福利在线观看 | 婷婷视频一区二区三区 | 久久美女视频 | 日本中文字幕在线 | 久久久久久国产精品免费 | 第一福利丝瓜av导航 | 99热精品在线播放 | 射网站| 欧美日韩国产图片 | 国产一区二区三区四区精 | 中国黄色大片 | 麻豆精品自拍 | 嫩草精品 | 国产一区二区亚洲 | 国产亚洲女人久久久久毛片 | 日韩大片一区 | 精品视频成人 | 日韩欧美在线一区二区 | 少妇极品熟妇人妻无码 | 校园春色中文字幕 | 国产午夜激情 | 一级黄色免费网站 | 麻豆网页| av青草| 丁香婷婷久久 | 黄色正能量网站 | 国内9l自拍 | 亚洲视频一二三四 | 天堂一区在线观看 | 国产小视频在线免费观看 | np视频 | 国产91精品久久久 | 免费一级淫片aaa片毛片a级 | 少妇被躁爽到高潮无码人狍大战 | 加勒比视频在线观看 | a黄视频| jizz性欧美17| 天天色av| 亚洲啪啪 | 粉嫩av一区二区白浆 | 久久深夜 | 禁漫天堂在线 | av资源网在线| 日本a免费 | 日韩一区二区免费看 | 日本一区二区久久 | www.日本黄 | 国产精品扒开腿做爽爽爽a片唱戏 | 青青在线 | 日本精品免费视频 | 欧美成人午夜电影 | 综合另类| 自拍偷拍亚洲综合 | 亚洲第一成网站 | 国产精品二区在线观看 | 欧美成人精品一区二区男人看 | 丰满少妇被猛烈进入高清播放 | 久久无码视频网站 | 六月丁香婷婷网 | 亚洲激情中文字幕 | 国产精品久久久久久一区二区三区 | 奇米影视在线播放 | 91蜜桃视频在线观看 | 青青视频免费观看 | 波多野结衣中文字幕久久 | 日韩视频一区二区在线观看 | a级在线视频 | 中文字幕中文在线 | 国产一级淫 | 精品一区二区国产 | 国产乱色精品成人免费视频 | 婷婷色综合网 | 国产午夜成人久久无码一区二区 | 十八岁世界在线观看高清免费韩剧 | 800av免费在线观看 | 日韩欧美一级在线 | 国产成人综合视频 | 小柔好湿好紧太爽了国产网址 | 国产网站黄色 | www.久久久久久久久久 | 久久久久99精品国产片 | 久久久黄色 | 91天堂素人 | av在线电影观看 | 亚洲激情五月 | 日干夜干天天干 |