flask sqlalchemy 根据日期查询数据库记录

用flask-sqlalchemy以orm模式根据日期查询数据库记录,看似很简单,也很平常的操作呀,硬是搞死我了,花了两个小时才搞定,囧ORZ

我数据库mytable中有一个datetime类型字段create_date,然后我们需要查询今天的数据记录,正常我们sql语句来做这个事,非常简单,地球人都知道,用DATE()嘛:

select * from mytable where DATE(create_date) == CURDATE()

然鹅,我们flask-sqlalchemy的orm模式呢:ormModel.query.filter(“xxxx”)
这里面的xxx怎么写,我真是绕了几个弯才出来:

方案1 填充datetime后再丢进去比较

这个方案中我的实际需求是我需要根据起止日期查询数据库记录

# 先传参进来string类型的起、止日期,然后直接丢进查询语句里面
mintime = mindate + ' ' + '0:0:0'
maxtime = maxdate + ' ' + '23:59:59'
record_list = RecordModel.query.filter(RecordModel.reporttime >= mintime).filter(
                    RecordModel.reporttime <= maxtime).order_by(RecordModel.reporttime.desc()).all()

这个方法感觉太low了!

方案2 使用SQL CAST函数

这个方案中我直接查询今日的数据,使用cast函数可以获取datetime字段的date部分,激动!
先看CAST函数介绍:CAST (expression AS data_type)
参数说明:
expression:任何有效的SQServer表达式。
AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。
用CAST函数进行数据类型转换时,在下列情况下能够被接受:
(1)两个表达式的数据类型完全相同。
(2)两个表达式可隐性转换
(3)必须显式转换数据类型

好!我们试下:

# 先导入sql db对象
records = RecordModel.query.filter(db.cast(RecordModel.reporttime, db.DATE) == db.cast(datetime.datetime.now(), db.DATE)).all()

查询成功,完美!

方案3 使用SQL EXTRACT函数

这个方案是网上查的,把年、月、日单独拎出来去匹配,我没试过,供参考

# 查询2016年5月每天的数据
session.query(extract(‘day‘, User.create_date).label(‘day‘), func.count(*)).filter(extract(‘month‘, User.create_date) == 5, extract(‘year‘, User.create_date) == 2016).group_by(‘day‘).all()

走过的弯路+1,Mark!

分析:主要原因是初学框架,对orm里面查询条件哪些原生SQL语句、函数可以用,哪些用不了不熟悉,对sqlalchemy对象的属性也不甚了解

发布了25 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/arnolan/article/details/84860895