比较日期与SQLAlchemy,SQLite
我正在写一个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没有对date
或datetime
类型的本地支持,并且它们存储为字符串。但SA应该处理转换(返回结果时)和来自(插入记录时)date
或datetime
对象的转换。我假设它在运行比较过滤器时也应该能够处理这个问题。我已经阅读了几个不同的SO线程,并已考虑使用between()
来筛选出与my_date
匹配的对象,但是当确切的==
是我正在寻找的对象时,似乎并不需要这样做。我也研究过使用.filter(cast(Table.date_field,DATE) == my_date)
来确保我得到对象的比较,但是这似乎也不起作用。
显然我错过了SQLAlchemy处理日期的方式,特别是SQLite数据库。我如何才能获得存储在SQLAlchemy的SQLite数据库中的Date
与作为参数提供的datetime.date()
对象之间的精确匹配?谢谢你的帮助。
这个问题确实存在于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()
这可能是很晚了,但迟到总比不到好,所以它可能有益于他人:)
都去尝试一下铸造日期:
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))
为我工作!谢谢! – fatman13 2017-03-24 06:57:00