【问题标题】:Comparing Dates with SQLAlchemy, SQLite使用 SQLAlchemy、SQLite 比较日期
【发布时间】:2013-04-20 03:23:22
【问题描述】:

我正在编写一个将 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() 对象之间获得完全匹配?感谢您的帮助。

【问题讨论】:

    标签: python database sqlite sqlalchemy


    【解决方案1】:

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

    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】:

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

      尝试将它们都转换为日期:

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

      【讨论】:

      • 为我工作!谢谢!
      • Sqlite 不支持转换为日期,它只返回年份。这可能会返回不正确的结果。
      【解决方案3】:

      以上答案都不适合我,但我通过此链接找到了解决方案: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()
      

      【讨论】:

      • 我可以确认这创造了奇迹!也适用于 SQLAlchemy 1.4
      猜你喜欢
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多