尝试在 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 执行查询吗

SQLAlchemy对数据库的高级查询操作

如何在 SQLAlchemy 中使用空集合进行分页查询?

如何在 sqlalchemy 中执行 LIKE 查询?

SQLAlchemy中的PostgreSQL RAW查询[重复]

Sqlalchemy,原始查询和参数