業務背景:
- 某些數據需要篩選后顯示,如果是普通的篩選一般都是字符串或數字的形式,然而日期的形式很少用。當前業務需求對某一天的業務日志進行篩選。
思考:
- 在SQL中,篩選條件可以用where xx="2019-08-07"的寫法,但在sqlalchemy中,對datetime數據類型的修改往往不能這么寫。
解決方案:
采用sqlalchemy的extract函數和and函數。前者可比較年月日信息,后者可表示sql中的and。
實例:
接口采用POST方法,接口信息:
{
"date": "2019-08-07",
"monitor_id": 1
}
- monitor_id為業務字段,可忽略,重點來看date字段。
- 需要比較的數據:MonitorCameraList模型類中的updated_at字段,datetime類型,見下。
- 接口傳入的date字段是一個字符串,需要先轉化成時間元組,可使用datetime的strptime方法。然后datetime中的year,month,day屬性可以獲取到年月日信息。這一步是很重要的,因為接口傳過來的都是變量,你不知道具體是哪一天的信息,因此一定要學會這種對變量做轉化的方法。
query = MonitorCameraList.query.filter(
MonitorCameraList.move_status == 1,
MonitorCameraList.monitor_id == body["monitor_id"]
)
# 篩選條件
if "date" in body:
date_tuple = datetime.strptime(body["date"], "%Y-%m-%d")
query = query.filter(and_(
extract("year", MonitorCameraList.updated_at) == date_tuple.year,
extract("month", MonitorCameraList.updated_at) == date_tuple.month,
extract("day", MonitorCameraList.updated_at) == date_tuple.day
)
)
sth_list = query.all()
使用extract過濾,sth_list字段就可以獲得篩選后的結果了。