【问题标题】:Trying to execute an 'advanced' query in SQLAlchemy but I'm stuck尝试在 SQLAlchemy 中执行“高级”查询,但我被卡住了
【发布时间】:2011-03-12 08:40:12
【问题描述】:

我尝试执行的查询是this one。我已经把它贴在下面了:

SELECT p.id, p.title, p.time_submitted, SUM(v.score) as num_votes 
FROM posts p, votes v
WHERE v.postid = p.id
GROUP BY p.id
ORDER BY 
   (SUM(v.score) - 1) / POW(TIMESTAMPDIFF(HOUR,p.time_submitted,NOW()) + INTERVAL 2 HOUR, 1.8) DESC
LIMIT 100

我打算使用connection.execute 手动运行 SQL 而不使用 ORM,但后来意识到它会在开发模式(金字塔)中失败,因为 sqlite 不支持使用的函数。

我将如何使用 ORM 执行此操作?

DBSession().query(Posts).join(Posts.id, Votes.post_id).group_by(Posts.id).order_by(...)

我不知道如何更进一步>.

【问题讨论】:

    标签: python sql orm sqlalchemy


    【解决方案1】:

    正如您已经说过的,您的查询中有一些函数在 sqlite 中不受支持(例如,“pow”)。在这种情况下,使用 SA 表达式函数构造查询对您没有帮助,因为生成的查询仍将包含 sqlite 不支持的“pow”函数。

    当然,除了在新项目中使用 sqlite 非常简单之外,没有什么可以阻止您在开发时使用不同类型的数据库,在这种情况下您可能需要这样做。

    如果你想涉足函数的东西,看看你的查询看起来像这样(警告:未经测试的代码):

    
    sum_result = func.sum(Vote.score) - 1
    time_difference_result = func.pow(func.timestampdiff(text('HOUR'), Post.time_submitted, func.current_timestamp()) + func.interval(2, text('HOUR')), 1.8)
    time_difference_result = func.timestampdiff(text('HOUR'), Post.time_submitted, func.now()) + func.interval(2, text('HOUR'))
    vote_calculation = (sum_result / time_difference_result).label('vote_calculation')
    
    session.query(Post.id, Post.title, vote_calculation)\
            .join(Vote)\
            .group_by(Post.id, Post.title)\
            .order_by('vote_calculation DESC')[:100]
    

    【讨论】:

      猜你喜欢
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      相关资源
      最近更新 更多