我正在编写一个将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没有对date
或datetime
类型的本机支持,并且它们存储为字符串。但SA应该处理转换为(返回结果时)和(插入记录时)date
或datetime
对象的转换。我认为它应该能够在运行比较过滤器时处理这个问题。我已经阅读了几个不同的SO线程,并考虑使用between()
来过滤掉与my_date
匹配的对象,但是当精确的==
是什么时,似乎不应该这样做我在寻找。我还研究过使用.filter(cast(Table.date_field,DATE) == my_date)
来确保我得到对象的比较,但这似乎也没有用。
显然,我遗漏了SQLAlchemy处理日期的方式,尤其是SQLite数据库。如何在SQLAlchemy中存储在SQLite数据库中的Date
与作为参数提供的datetime.date()
对象之间进行精确匹配?谢谢你的帮助。
答案 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()