2011-03-12 25 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 

我要訴諸使用connection.execute手動運行該SQL不使用ORM,但後來意識到它會在開發模式(金字塔)失敗,因爲SQLite不支持使用的功能。

我怎麼會去與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]