尝试在 SQLAlchemy 中执行“高级”查询,但我被卡住了
Posted
技术标签:
【中文标题】尝试在 SQLAlchemy 中执行“高级”查询,但我被卡住了【英文标题】:Trying to execute an 'advanced' query in SQLAlchemy but I'm stuck 【发布时间】: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(...)
我不知道如何更进一步>.
【问题讨论】:
【参考方案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]
【讨论】:
以上是关于尝试在 SQLAlchemy 中执行“高级”查询,但我被卡住了的主要内容,如果未能解决你的问题,请参考以下文章
我可以在没有事务的情况下通过 sqlalchemy 执行查询吗