将日期与SQLAlchemy,SQLite进行比较

时间:2013-04-26 03:19:59

标签: python database sqlite sqlalchemy

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

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()对象之间进行精确匹配?谢谢你的帮助。

3 个答案:

答案 0 :(得分:5)

这可能会很晚,但迟到总比没有好,所以它可能会让其他人受益:)

尝试将它们都投射到日期:

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))

答案 1 :(得分:0)

问题的确存在于字符串(SQLite中的Date对象的表示)和python中的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()

答案 2 :(得分:0)

以上答案均不适用于我,但我通过以下链接找到了一种解决方案:https://gist.github.com/danielthiel/8374607

按以下方式使用sqlachemy的func.DATE()函数:

from sqlalchemy import func

session.query(Table).filter(func.DATE(Table.date_field) == my_date).all()