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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

django model filter_Django分表的两个方案

發(fā)布時間:2025/4/16 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django model filter_Django分表的两个方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

由來

知乎上的一個問題:Django 分表 怎么實現(xiàn)?

這個問題戳到了Django ORM的痛點,對于多數(shù)據(jù)庫/分庫的問題,Django提供了很好的支持,通過using和db router可以很好的完成多數(shù)據(jù)庫的操作。但是說到分表的問題,就有點不那么友好了。但也不是那么難處理,只是處理起來不太優(yōu)雅。

解析

在Django中,數(shù)據(jù)庫訪問的邏輯基本上是在Queryset中完成的,一個查詢請求,比如:User.objects.filter(group_id=10)。

其中的objects其實就是models.Manager,而Manager又是對QuerySet的一個包裝。而QuerySet又是最終要轉(zhuǎn)換為sql的一個中間層(就是ORM種,把Model操作轉(zhuǎn)換為SQL語句的部分)。所以當(dāng)我們寫下User.objects的時候,就已經(jīng)確定了要訪問的是哪個表了,這是由class Meta中的db_table決定的。

class

理論上講,我們可以通過在運行時修改db_table來完成分表CRUD的邏輯,但是the5fire在看了又看源碼之后,還是沒找到如何下手。還是上面的問題,當(dāng)執(zhí)行到User.objects的時候,表已經(jīng)確定了,當(dāng)執(zhí)行到User.objects.filter(group=10)的時候只不過是在已經(jīng)生成好的sql語句中增加了一個where部分語句。所以并沒有辦法在執(zhí)行filter的時候來動態(tài)設(shè)置db_table。

對于問題中說的get也是一樣,因為get本身就是在執(zhí)行完filter之后從_result_cache列表中獲取的數(shù)據(jù)(_result_cache[0])。

方案一

根據(jù)the5fire上面的分析,要想在執(zhí)行具體查詢時修改db_table已經(jīng)是不可能了(當(dāng)然,如果你打算去重寫Model中Meta部分的邏輯以及Queryset部分的邏輯,就當(dāng)我沒說,我只能表示佩服)。

所以只能從定義層面下手了。也就是我需要定義多個Model,同樣的字段,不同的db_table。大概是這樣。

class

這樣在User.objects.get(id=3)的時候,如果按照模2計算,那就是User01.objects.get(id=3),笨點的方法就是寫一個dict:

user_sharding_map

如果真的這么寫那Python作為動態(tài)語言,還有啥用,你分128張表試試。我們應(yīng)該動態(tài)創(chuàng)建出User01,User02,....UserN這樣的表。

class

嗯,這樣看起來似乎好了一下,但是還有問題,id=3需要傳兩次,如果兩次不一致,那就麻煩了。Model層要為上層提供統(tǒng)一的入口才行。

class MyUser(models.Model):# 增加方法 BY the5fire@classmethoddef sharding_get(cls, id=None, **kwargs):assert id, 'id is required!'Model = cls.get_sharding_model(id=id)return Model.objects.get(id=id, **kwargs)

對上層來書,只需要執(zhí)行MyUser.sharding_get(id=10)即可。不過這改變了之前的調(diào)用習(xí)慣 objects.get 。

不管怎么說吧,這也是個方案,更完美的方法就不繼續(xù)探究了,在Django的ORM中鉆來鉆去尋找可以hook的點實在憋屈。

我們來看方案二吧

方案二

ORM的過程是這樣的,Model——> SQL ——> Model,在方案一中我們一直在處理Model——> SQL的部分。其實我們可以拋開這一步,直接使用raw sql。

QuerySet提供了raw這樣的接口,用來讓你忽略第一層轉(zhuǎn)換,但是有可以使用從SQL到Model的轉(zhuǎn)換。只針對SELECT的案例:

class

大概這么個意思吧,代碼可以再嚴(yán)謹(jǐn)些。

總結(jié)

單純看方案一的話,可能會覺得這么大量數(shù)據(jù)的項目,就別用Django了。其實the5fire第一次嘗試找一個優(yōu)雅的方式hack db_table時,也是一頭灰。但是,所有的項目都是由小到大的,隨著數(shù)據(jù)/業(yè)務(wù)的變大,技術(shù)人員應(yīng)該也會更加了解Django,等到一定階段之后,可能發(fā)現(xiàn),用其他更靈活的框架,跟直接定制Django成本差不多。

補(bǔ)充兩個github repo: - JBKahn/django-sharding - disqus/sharding-example

----EOF-----

掃碼關(guān)注,或者搜索微信公眾號:Python程序員雜談

總結(jié)

以上是生活随笔為你收集整理的django model filter_Django分表的两个方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 污网站在线免费 | 国产日产亚洲精品 | 有码视频在线观看 | 日韩中文一区二区 | 中国吞精videos露脸 | 无码精品久久久久久久 | 日韩美女在线 | 日本一区二区三区免费在线观看 | 国产观看 | 成人av在线播放网站 | 午夜少妇久久久久久久久 | 亚洲成人精品视频 | 999国产精品视频免费 | 人人玩人人干 | 麻豆视频一区 | 国产一二区视频 | 91欧美国产 | 国产一区二区三区在线视频 | 人人爽人人爽人人爽人人爽 | 麻豆最新网址 | 男人日女人b视频 | 中文字幕久久久久 | 亚洲爽爽爽| 国产一级黄| 伊人久久爱| 麻豆人妻少妇精品无码专区 | 免费成年人视频在线观看 | 久久精品a亚洲国产v高清不卡 | 九九色播 | 欧洲午夜精品 | 黑巨茎大战欧美白妞 | 亚洲精品电影 | 滋润少妇h高h | 国内精品偷拍 | 精品国产三级片在线观看 | 91麻豆精品国产91久久久久久久久 | 精品人妻一区二区三区在线视频 | 18岁毛片 | 亚洲成人诱惑 | 亚洲第一视频在线 | 久久免费看少妇高潮 | 欧美亚洲激情 | 国产精品亚洲精品 | 久久香蕉网 | 国产真实乱人偷精品视频 | 日韩高清影院 | 国产乱一区二区三区 | youjizz.com在线观看 | 免费黄色小视频 | 成人精品999| 色欲狠狠躁天天躁无码中文字幕 | cao久久 | 日韩中文字幕网站 | 久久久久久久蜜桃 | 国产精品粉嫩 | 国产又黄又嫩又滑又白 | 黄视频在线免费看 | 999色综合 | 99在线精品视频免费观看软件 | 午夜在线免费视频 | 日本免费三片在线播放 | 中文字幕成人动漫 | 亚洲av无码一区二区三区四区 | 97香蕉碰碰人妻国产欧美 | 亚洲影音 | 美女张开腿让人桶 | 日本中文字幕在线免费观看 | 国产精品影音先锋 | 一久久久| 老熟妇毛茸茸 | 国内性视频 | 黄色一集片| 日本极品喷水 | 一级片手机在线观看 | www视频在线免费观看 | 在线观看成年人视频 | 国产欧美大片 | 风流僵尸艳片a级 | 视频这里只有精品 | 岛国av在线 | 中文字幕免费视频观看 | 天天做天天操 | 成人av一区 | 毛片网站有哪些 | 这里只有精品视频在线观看 | 亚洲精品成人片在线观看精品字幕 | 国产精品女人精品久久久天天 | 影音先锋中文字幕一区 | 欧美日韩乱国产 | 久久久久这里只有精品 | 国产一级做a爰片久久毛片男男 | 中国挤奶哺乳午夜片 | 国产伦精品视频一区二区三区 | 一区二区三区日韩欧美 | 夜夜骚av| avav亚洲| 男性影院| 清纯唯美亚洲激情 | 国产日韩欧美日韩大片 |