2013-04-26 187 views
0

我正在写一个SQLAlchemy与SQLite数据库的应用程序。我相信我的数据库,表和映射配置正确,因为其他操作按预期工作。我正在尝试编写一个函数,用于检索其日期字段与作为参数提供给该函数的datetime.date()相匹配的所有对象。这是我第一次尝试:比较日期与SQLAlchemy,SQLite

def get_objects_matching_date(session,my_date): 
    return session.query(Table).filter(Table.date_field == my_date).all() 

事件虽然我知道Table包含对象的标准匹配,函数返回什么。

我从阅读SA documentation知道,sqlite没有对datedatetime类型的本地支持,并且它们存储为字符串。但SA应该处理转换(返回结果时)和来自(插入记录时)datedatetime对象的转换。我假设它在运行比较过滤器时也应该能够处理这个问题。我已经阅读了几个不同的SO线程,并已考虑使用between()来筛选出与my_date匹配的对象,但是当确切的==是我正在寻找的对象时,似乎并不需要这样做。我也研究过使用.filter(cast(Table.date_field,DATE) == my_date)来确保我得到对象的比较,但是这似乎也不起作用。

显然我错过了SQLAlchemy处理日期的方式,特别是SQLite数据库。我如何才能获得存储在SQLAlchemy的SQLite数据库中的Date与作为参数提供的datetime.date()对象之间的精确匹配?谢谢你的帮助。

回答

0

这个问题确实存在于Python中的字符串(SQLite中的Date对象的表示)和date对象之间的转换。尽管遵循数据类型之间相当长的转换顺序(date-> datetime-> string),下面的解决方案似乎工作得很好。也许还有另外一种方式,但这是有效的。

def get_objects_matching_date(session,my_date): 
    return session.query(Table).\ 
     filter((strftime("%Y-%m-%d",datetime.combine(my_date,time()).timetuple())).all() 
3

这可能是很晚了,但迟到总比不到好,所以它可能有益于他人:)

都去尝试一下铸造日期:

from sqlalchemy import Date, cast 
from datetime import datetime 

created_at = datetime.now().date() 
query.filter(cast(Model.created_at, Date) == cast(created_at,Date)) 
+0

为我工作!谢谢! – fatman13 2017-03-24 06:57:00