sqlalchemy 原生SQL中的日期过滤
我之前创建了一些动态过滤器,比如这样:
q = Session.query(Table)
search_conditions = "%s ILIKE '%s%s%s'" % (str(nm), '%', val ,'%')
q = q.filter(search_conditions)
这个在处理字符串和整数的时候效果还不错,但现在我需要像这样过滤日期。我有一个日期列,想要像这样进行过滤:
date = '01.01.2011'
fd,fm,fy = date.split('.')
from_date = dt.date(int(fy),int(fm),int(fd))
ffilter = "%s > %r" %(str(ft), fromdate)
q = q.filter(ffilter)
你能帮我解决这个问题吗?
最好的祝福,谢尔盖
3 个回答
0
你想要的过滤器最后应该是这样的(在发送到数据库之前):
date_field > '2011-01-01'
所以,试试这个:
date = '01.01.2011'
fd,fm,fy = date.split('.')
from_date = '-'.join([fy,fm,fd])
ffilter = "%s > '%r'" %(date_field, from_date)
q = q.filter(ffilter)
更新:在%r
周围缺少引号
4
这段代码看起来不是很符合 sqlalchemy 的常规用法。你已经有一个 Table
对象可以用来构建查询,其实你也可以用它来动态地表达生成的 WHERE
子句中的条件。
date = '01.01.2011'
from_date = dt.datetime.strptime(date, "%d.%m.%Y").date()
q = session.query(Table) \
.filter(Table.c[nm].like('%%%s%%' % val) ) \
.filter(Table.c[ft] > from_date)
这其实是使用 sqlalchemy 的一个主要好处。
这种模式几乎适用于 sqlalchemy 的每个角落,比如说,如果你需要动态指定要从哪个 表 中选择数据,可以通过访问 MetaData.tables
属性来实现,这个属性其实也是一个字典。
如果你真的需要让用户有更大的表达自由,可能让他们直接输入 SQL 语句会更好。把 sqlalchemy 的生成查询和用户输入的表达混在一起,可能对你和用户都没有帮助。你可以考虑使用 sqlalchemy 来生成基本的查询框架,然后让用户根据自己的需要进行编辑和定制。
2
不太确定,但为什么不试试下面这个呢:
date = '01.01.2011'
ffilter = "%s > CAST('%s' AS DATE)" %(str(ft), date)
q = q.filter(ffilter)