试图在SQLAlchemy中执行'高级'查询,但我被卡住了

时间:2011-03-12 08:40:13

标签: python sql orm sqlalchemy

我正在尝试执行的查询是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但后来意识到它会在开发模式(Pyramid)中失败,因为sqlite不支持使用的函数。

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

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

我不知道如何进一步采取>。<

1 个答案:

答案 0 :(得分:0)

正如您已经说过的,查询中的某些函数在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]