2

我正在编写一个将 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 文档中知道 sqlite 没有对datedatetime类型的本机支持,并且它们存储为字符串。但是 SA 应该处理到(返回结果时)和从(插入记录时)datedatetime对象的转换。我假设它在运行比较过滤器时也应该能够处理这个问题。我已经阅读了几个不同的 SO 线程,并考虑使用between()它来过滤掉匹配的对象,但是当我正在寻找my_date确切的内容时,这似乎不是必需的。==我还研究了使用.filter(cast(Table.date_field,DATE) == my_date)以确保我得到对象的比较,但这似乎也不起作用。

显然,我遗漏了 SQLAlchemy 处理日期的方式,尤其是 SQLite 数据库。如何Date在 SQLAlchemy 存储在 SQLite 数据库中的 a 与datetime.date()作为参数提供的对象之间获得完全匹配?谢谢你的帮助。

4

3 回答 3

4

以上答案均不适合我,但我通过此链接找到了解决方案: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()
于 2019-08-06T09:45:28.063 回答
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))
于 2015-03-05T15:49:53.557 回答
0

问题确实在于字符串(DateSQLite 中的对象表示)和datepython 中的对象之间的转换。尽管在数据类型(日期->日期时间->字符串)之间进行了相当长的转换序列,但下面的解决方案似乎工作得很好。也许还有另一种方法,但这有效。

def get_objects_matching_date(session,my_date):  
    return session.query(Table).\
        filter((strftime("%Y-%m-%d",datetime.combine(my_date,time()).timetuple())).all()
于 2013-04-26T13:37:37.397 回答