Пытаюсь выполнить расширенный запрос в SQLAlchemy, но я застрял - PullRequest
0 голосов
/ 12 марта 2011

Я пытаюсь выполнить запрос: этот .Я вставил его ниже:

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(...)

Я не знаю, как это сделать дальше>. <</p>

1 Ответ

0 голосов
/ 12 марта 2011

Как вы уже сказали, в вашем запросе есть функции, которые не поддерживаются в sqlite (например, "pow").Использование функций выражений SA для построения вашего запроса не поможет вам в этом случае, так как результирующий запрос будет по-прежнему содержать функцию «pow», которую sqlite не поддерживает.

Конечно, кроме того факта, что 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...