2022-01-19.tortoise-orm執(zhí)行原生sql語句

最近在做的東西,用上了fastapi+tortoise-orm的技術方案订雾。
在fastapi的models.py中肢预,一般是這樣寫的:

from tortoise import Model, fields

class TableA(Model):
    idx = fields.IntField(pk=True)
    product = fields.CharField(max_length=60, null=True)
    price = fields.CharField(max_length=60, null=True)
    create_date = fields.DatetimeField()

    @classmethod
    async def get_by_product(cls, product):
        """ 根據(jù)product獲取數(shù)據(jù) """
        result = await cls.get_or_none(product=product)
        return result

這時候,想用一些原生sql語句執(zhí)行一些復雜的查詢葬燎,tortoise提供了一個raw()方法误甚。一般會使用下面的寫法:

@classmethod
async def get_count_by_year(cls):
    result = await cls.raw("SELECT year(create_date) FROM TableA GROUP BY year(create_date)")

按此執(zhí)行缚甩,一般會報錯,顯示keyError year(create_date)之類的信息窑邦。

實際上這個問題非常容易解決擅威。只需要在class TableA中聲明SELECT的字段就行,即將class修改為如下:

class TableA(Model):
    idx = fields.IntField(pk=True)
    product = fields.CharField(max_length=60, null=True)
    price = fields.CharField(max_length=60, null=True)
    create_date = fields.DatetimeField()
    year_date = fields.CharField(max_length=60, null=True)

并將year(create_date)的結果儲存為year_date字段冈钦,形如以下:

@classmethod
async def get_count_by_year(cls):
    result = await cls.raw("SELECT year(create_date) as year_date FROM TableA GROUP BY year(create_date)")

這樣就可以了郊丛。

以上,如果有錯誤瞧筛,還請留言批評指正厉熟。

2022-01-22 增加:

上文這個方法有問題,這樣做了之后较幌,還是會報錯:"Unknown column..."
還得在SQL的表里增加對應的字段……這雖然可以使用了揍瑟,但是很丑。

如果有什么更好的方法乍炉,還請不吝賜教绢片。

2022-01-22 增加:

找到一個方法。將models.py 增加引入:

from tortoise import Tortoise

并編輯方法:

@classmethod
async def get_by_query(cls, query):
    db = Tortoise.get_connection("default")
    result = await db.execute_query_dict(query)
    return result

這時候岛琼,就不需要按文章開頭的做法底循,增加字段,也不需要在SQL的表中增加字段了槐瑞。

不過熙涤,需要注意的是,上面方法獲取的結果為dict組成的list困檩,dict的keys為表的字段名(帶類型)祠挫,在使用時無法直接用類的屬性獲取,需要特別注意悼沿。

哎茸歧,如果能使用raw()方法,并且對key沒有那么些約束就好了显沈。
如果有软瞎,還請不吝賜教。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拉讯,一起剝皮案震驚了整個濱河市涤浇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魔慷,老刑警劉巖只锭,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異院尔,居然都是意外死亡蜻展,警方通過查閱死者的電腦和手機喉誊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纵顾,“玉大人伍茄,你說我怎么就攤上這事∈┯猓” “怎么了敷矫?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汉额。 經(jīng)常有香客問我曹仗,道長,這世上最難降的妖魔是什么蠕搜? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任怎茫,我火速辦了婚禮,結果婚禮上妓灌,老公的妹妹穿的比我還像新娘遭居。我一直安慰自己,他們只是感情好旬渠,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著端壳,像睡著了一般告丢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上损谦,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天岖免,我揣著相機與錄音,去河邊找鬼照捡。 笑死颅湘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的栗精。 我是一名探鬼主播闯参,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悲立!你這毒婦竟也來了鹿寨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤薪夕,失蹤者是張志新(化名)和其女友劉穎脚草,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體原献,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡馏慨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年埂淮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片写隶。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡倔撞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出樟澜,到底是詐尸還是另有隱情误窖,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布秩贰,位于F島的核電站霹俺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毒费。R本人自食惡果不足惜丙唧,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望觅玻。 院中可真熱鬧想际,春花似錦、人聲如沸溪厘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畸悬。三九已至侧甫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹋宦,已是汗流浹背披粟。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冷冗,地道東北人守屉。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蒿辙,于是被迫代替她去往敵國和親拇泛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Django Django 是 Python 下最有代表性的 Web 框架思灌,目的是要實現(xiàn)簡單快捷的網(wǎng)站開發(fā)碰镜。 對象...
    thelastcookies閱讀 614評論 0 0
  • 安裝Nginx:yum install -y nginxsystemctl start nginxsystemct...
    碧潭飄雪ikaros閱讀 697評論 0 1
  • 前言 Django框架功能齊全自帶數(shù)據(jù)庫操作功能,本文主要介紹Django的ORM框架 https://www.c...
    許華鋒閱讀 1,926評論 0 0
  • 記錄集 model的數(shù)據(jù)是通過數(shù)據(jù)集合的形式來使用的习瑰,定義在model里的函數(shù)執(zhí)行時它們的self變量也是一個數(shù)據(jù)...
    XiaoHaiYang閱讀 16,902評論 0 16
  • 一 **** ORM模型介紹 Ⅰ* ORM绪颖,全稱Object Relational Mapping,中文叫做對象關...
    幼姿沫閱讀 448評論 0 0