DESCENDING द्वारा SQLAlchemy आदेश?


424

मैं descendingनिम्नलिखित की तरह SQLAlchemy क्वेरी में ORDER BY का उपयोग कैसे कर सकता हूं ?

यह क्वेरी काम करती है, लेकिन उन्हें आरोही क्रम में लौटाती है:

query = (model.Session.query(model.Entry)
        .join(model.ClassificationItem)
        .join(model.EnumerationValue)
        .filter_by(id=c.row.id)
        .order_by(model.Entry.amount) # This row :)
        )

अगर मैं कोशिश करूँ:

.order_by(desc(model.Entry.amount))

फिर मुझे मिलता है NameError: global name 'desc' is not defined:।

जवाबों:


692

FYI के रूप में, आप उन चीज़ों को कॉलम विशेषताओं के रूप में भी निर्दिष्ट कर सकते हैं। उदाहरण के लिए, मैंने किया हो सकता है:

.order_by(model.Entry.amount.desc())

यह आसान है क्योंकि यह एक से बचा जाता है import , और आप इसे अन्य स्थानों पर उपयोग कर सकते हैं जैसे कि एक संबंध परिभाषा में, आदि।

अधिक जानकारी के लिए, आप इसे संदर्भित कर सकते हैं


28
यह भी एक से बचा जाता है import
कापी ईथरल

1
क्या इसके लिए कोई एपीआई संदर्भ है, यह जानने के लिए अच्छा होगा कि और क्या उपलब्ध है?
जॉन माइक

इसके लिए धन्यवाद। ऐसा लगता है कि यह आधिकारिक दस्तावेज से गायब है।
2333 पर user3341078

1
सबसे अच्छी प्रतिक्रिया (फिलहाल)।
रोड्रीकिंग


338
from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

@ Jpmc26 से उपयोग


15
उपयोग: someselect.order_by(desc(table1.mycol))( डॉक्स से लिया गया है ।) ... क्योंकि मैं एक के लिए यह आपके प्रश्न में ध्यान नहीं दिया।
jpmc26

1
डॉक्स में एक नया यूआरएल है
ह्यूजेस

73

एक अन्य चीज़ जो आप कर सकते हैं वह है:

.order_by("name desc")

यह परिणाम होगा: ORDER BY नाम desc। यहाँ नुकसान स्पष्ट स्तंभ नाम है, जिसका उपयोग क्रम में किया गया है।


25
यह संभावित भंगुर वर्कअराउंड है जहां वर्कअराउंड की आवश्यकता नहीं है।
ब्लूबंबर

13
यह अच्छा है यदि आपके पास किसी कारण से स्ट्रिंग में सॉर्ट कॉलम है, हालांकि (वेब ​​एपीआई में सैनिटाइज्ड इनपुट की तरह)।
जिम स्टीवर्ट

19
एक फॉलोअप के रूप में, आप भी कर सकते हैं getattr(MyModelClass, column_string).desc()यदि आपको एक स्ट्रिंग मिल गई है।
जिम स्टीवर्ट

9
@JimStewart और दिशा में गुजरने के लिए मैंने प्रयोग करना समाप्त कर दिया:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
आप इसका उपयोग भी कर सकते हैं यदि आपने अपने आउटपुट को लेबल किया है और एक मॉडल कॉलम के बजाय एक गणना कॉलम द्वारा सॉर्ट कर रहे हैं
नाविकोड

28

आप .desc()इस तरह से अपनी क्वेरी में फ़ंक्शन का उपयोग कर सकते हैं

query = (model.Session.query(model.Entry)
        .join(model.ClassificationItem)
        .join(model.EnumerationValue)
        .filter_by(id=c.row.id)
        .order_by(model.Entry.amount.desc())
        )

यह अवरोही क्रम में राशि द्वारा आदेश देगा या

query = session.query(
    model.Entry
).join(
    model.ClassificationItem
).join(
    model.EnumerationValue
).filter_by(
    id=c.row.id
).order_by(
    model.Entry.amount.desc()
)
)

SQLAlchemy के desc फ़ंक्शन का उपयोग

from sqlalchemy import desc
query = session.query(
    model.Entry
).join(
    model.ClassificationItem
).join(
    model.EnumerationValue
).filter_by(
    id=c.row.id
).order_by(
    desc(model.Entry.amount)
)
)

आधिकारिक डॉक्स के लिए कृपया स्निपेट के नीचे दिए गए लिंक या जांच का उपयोग करें

sqlalchemy.sql.expression.desc (स्तंभ) खंड तत्व द्वारा अवरोही ORDER उत्पन्न करता है।

उदाहरण के लिए:

from sqlalchemy import desc

stmt = select([users_table]).order_by(desc(users_table.c.name))

SQL का उत्पादन इस प्रकार होगा:

SELECT id, name FROM user ORDER BY name DESC

Desc () फ़ंक्शन ColumnElement.desc () पद्धति का एक स्टैंडअलोन संस्करण है जो सभी SQL अभिव्यक्तियों पर उपलब्ध है, जैसे:

stmt = select([users_table]).order_by(users_table.c.name.desc())

पैरामीटर्स कॉलम - एक कॉलमइनमेंट (जैसे स्केलर एसक्यूएल एक्सप्रेशन) जिसके साथ desc () ऑपरेशन को लागू करना है।

यह सभी देखें

एएससी ()

nullsfirst ()

nullslast ()

Select.order_by ()


5
यह कैसे नहीं का डुप्लिकेट है stackoverflow.com/a/4187279/2718295
cowbert

12

तुम कोशिश कर सकते हो: .order_by(ClientTotal.id.desc())

session = Session()
auth_client_name = 'client3' 
result_by_auth_client = session.query(ClientTotal).filter(ClientTotal.client ==
auth_client_name).order_by(ClientTotal.id.desc()).all()

for rbac in result_by_auth_client:
    print(rbac.id) 
session.close()

0

@Radu उत्तर में पूरक के रूप में, SQL में, आप पैरामीटर में तालिका का नाम जोड़ सकते हैं यदि आपके पास एक ही विशेषता वाली कई तालिका है।

.order_by("TableName.name desc")

क्या इसे पाठ द्वारा स्ट्रिंग को लपेटने की आवश्यकता नहीं है ()?
ग्लूटेक्सो

ध्यान रखें कि यह SQLAlchemy> 1.3 में एक त्रुटि का कारण बनता है, जो निचले संस्करणों में एक चेतावनी है
Checo R
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.