2009-09-03 18 views
11

मैं चाहता हूँ "DBSession.query (अनुच्छेद) .group_by (Article.created.month) सब के सब()"समूह

लेकिन इस क्वेरी

का उपयोग कर नहीं कर सकते

मैं एसक्यूएलकेमी का उपयोग करके ऐसा कैसे करूं?

उत्तर

25

आप db इंजन संभालने वास्तव में MONTH() जैसे कार्यों का समर्थन करता है, तो आप कोशिश कर सकते हैं

import sqlalchemy as sa 
DBSession.query(Article).group_by(sa.func.year(Article.created), sa.func.month(Article.created)).all() 
बाकी

आप की तरह

from itertools import groupby 

def grouper(item): 
    return item.created.year, item.created.month 
for ((year, month), items) in groupby(query_result, grouper): 
    for item in items: 
     # do stuff 
+0

वाह, धन्यवाद !!! ^^ – gamp

+0

धन्यवाद आदमी, बहुत उपयोगी – pylover

9

THC4k जवाब अजगर में समूह काम करता है सकते हैं, लेकिन मैं सिर्फ इतना है कि जोड़ना चाहते हैं query_result को क्रमबद्ध करने की आवश्यकता है itertools.groupby जिस तरह से आप चाहते हैं काम कर रहे हैं।)

GroupBy के संचालन (यूनिक्स में uniq फिल्टर के समान है:

query_result = DBSession.query(Article).order_by(Article.created).all() 

यहाँ itertools.groupby docs में व्याख्या है। जब भी कुंजी फ़ंक्शन में परिवर्तन होता है तो यह ब्रेक या नया समूह उत्पन्न करता है (यही कारण है कि एक ही कुंजी फ़ंक्शन का उपयोग करके डेटा को सॉर्ट करना आवश्यक होता है)। यह व्यवहार एसक्यूएल के ग्रुप बाय से अलग है जो उनके इनपुट ऑर्डर के बावजूद आम तत्वों को जोड़ता है।

2

मैं जानता हूँ कि इस सवाल का प्राचीन है, लेकिन समाधान के लिए खोज किसी के लाभ के लिए, यहाँ() डेटाबेस के लिए एक और रणनीति है कि महीने की तरह काम करता है समर्थन नहीं करते हैं:

db.session.query(sa.func.count(Article.id)).\ 
    group_by(sa.func.strftime("%Y-%m-%d", Article.created)).all() 

अनिवार्य रूप से यह हो रहा है टंकस्टैम्प स्ट्रिंग्स में टाइमस्टैम्प जिन्हें तब समूहीकृत किया जा सकता है। बस वर्ष और माह छोड़ते हुए द्वारा

order_by(Article.created.desc()).limit(7) 

इस रणनीति के बाद, आप आसानी से इस तरह के दिन के सप्ताह के रूप में समूह बना सकते हैं:

तुम सिर्फ सबसे हाल ही में प्रविष्टियों चाहते हैं, आप, उदाहरण के लिए जोड़ सकते हैं ।