最近在做的東西,用上了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沒有那么些約束就好了显沈。
如果有软瞎,還請不吝賜教。