sqlalchemy日期过滤器在原始sql中

时间:2011-08-16 19:44:51

标签: python sqlalchemy

我曾经创建像

这样的动态过滤器
q = Session.query(Table)    
search_conditions = "%s ILIKE '%s%s%s'" % (str(nm), '%', val ,'%')
q = q.filter(search_conditions)

它适用于string和int语句,但现在我需要像这样过滤日期。 我有一个日期列,并试图像这样过滤它

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 :(得分: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生成框架查询,然后让用户编辑它们以便以他们需要的方式自定义它们。

答案 1 :(得分:1)

不确定,但为什么不这样做:

date = '01.01.2011'

ffilter = "%s > CAST('%s' AS DATE)" %(str(ft), date)
q = q.filter(ffilter)

答案 2 :(得分: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

附近遗失的行情