2011-03-12 6 views
0

실행하려고하는 쿼리는 this one입니다. 나는 아래를 붙여 넣은 :SQLAlchemy에서 '고급'쿼리를 실행하려고했지만 막혔습니다

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 
내가 sqlite가가를 지원하지 않습니다로 개발 모드 (피라미드)에 실패 실현 수동으로 ORM을 사용하지 않고 SQL을 실행하는 데 connection.execute를 사용에 의존하려고 만했다

사용 된 기능.

ORM으로 어떻게 실행합니까?

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

나는 더 이상 그 방법을 알지 못합니다.> <

답변

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] 
관련 문제