【问题标题】:SQLAlchemy MySQL Timestamp column valueSQLAlchemy MySQL 时间戳列值
【发布时间】:2015-06-21 15:32:11
【问题描述】:

我需要执行一个查询,该查询仅比较 TIMESTAMP 列中的年份和月份值,其中记录如下所示:

2015-01-01 08:33:06

SQL 查询非常简单(有趣的部分是 year(timestamp)month(timestamp) 提取年份和月份以便我可以使用它们比较:

SELECT model, COUNT(model) AS count 
FROM log.logs 

WHERE SOURCE = "WEB"
AND year(timestamp) = 2015
AND month(timestamp) = 01
AND account = "TEST"
AND brand = "Nokia"

GROUP BY model
ORDER BY count DESC limit 10

现在的问题:

这是我的 SQLAlchemy 查询:

devices = (db.session.query(Logs.model, Logs.timestamp,
func.count(Logs.model).label('count'))

       .filter_by(source=str(source))
       .filter_by(account=str(acc))
       .filter_by(brand=str(brand))
       .filter_by(year=year)
       .filter_by(month=month)
       .group_by(Logs.model)
       .order_by(func.count(Logs.model).desc()).all())

部分:

 .filter_by(year=year)
 .filter_by(month=month) 

不一样
AND year(timestamp) = 2015
AND month(timestamp) = 01

我的 SQLAchemy 查询不工作。 yearmonth 似乎是从时间戳列中提取值的 MySQL 函数。

我的数据库模型如下所示:

class Logs(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    timestamp = db.Column(db.TIMESTAMP, primary_key=False)
    .... other attributes

有趣的是,当我选择并打印Logs.timestamp 时,它的格式如下:

(datetime.datetime(2013, 7, 11, 12, 47, 28))

如果我希望我的 SQLAlchemy 查询按 DB Timestamp 年份和月份进行比较,这部分应该如何用 SQLAlchemy 编写?

 .filter_by(year=year)  #MySQL - year(timestamp)
 .filter_by(month=month) #MySQL- month(timestamp)

我尝试了.filter(Logs.timestamp == year(timestamp) 和类似的变体,但没有运气。任何帮助将不胜感激。

【问题讨论】:

    标签: python mysql date sqlalchemy


    【解决方案1】:

    简单替换:

     .filter_by(year=year)
     .filter_by(month=month) 
    

    与:

    from sqlalchemy.sql.expression import func
    # ...
    
     .filter(func.year(Logs.timestamp) == year)
     .filter(func.month(Logs.timestamp) == month)
    

    在文档的SQL and Generic Functions 部分了解更多信息。

    【讨论】:

      【解决方案2】:

      如果您想使用特定于您的数据库的函数,您可以使用custom constructs,例如您为MySQL 提到的year 函数。但是我不使用MySQL,也不能给你一些经过测试的代码(顺便说一句,我什至不知道这个函数)。

      这对于 Oracle(经过测试)来说是一个简单而无用的示例。我希望你可以很容易地从这个中推断出你的。

      from sqlalchemy.sql import expression
      from sqlalchemy.ext.compiler import compiles
      from sqlalchemy import Date
      
      class get_current_date(expression.FunctionElement):
          type = Date()
      
      @compiles(get_current_date, 'oracle')
      def ora_get_current_date(element, compiler, **kw):
          return "CURRENT_DATE"
      
      session = schema_mgr.get_session()
      q = session.query(sch.Tweet).filter(sch.Tweet.created_at == get_current_date())
      tweets_today = pd.read_sql(q.statement, session.bind)
      

      但是我不需要提及,这样可以使高度可移植的SQLAlchemy 代码的可移植性降低一些。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 2015-10-12
        • 1970-01-01
        • 2021-01-06
        • 2015-12-18
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        相关资源
        最近更新 更多