sqlalchemy 原生SQL中的日期过滤

4 投票
3 回答
4418 浏览
提问于 2025-04-16 23:43

我之前创建了一些动态过滤器,比如这样:

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)

撰写回答