फ्लास्क SQLAlchemy क्वेरी, कॉलम नाम निर्दिष्ट करें


125

मैं एक मॉडल का उपयोग करके अपनी क्वेरी में इच्छित कॉलम को कैसे निर्दिष्ट कर सकता हूं (यह डिफ़ॉल्ट रूप से सभी कॉलम का चयन करता है)? मुझे पता है कि यह कैसे करना है sqlalchmey सत्र के साथ: session.query(self.col1)लेकिन मैं इसे मॉडल के साथ कैसे करूं? मैं नहीं कर सकता SomeModel.query()। क्या उधर रास्ता है?

जवाबों:


220

आप with_entities()परिणाम में वापस आने के लिए किन कॉलमों को प्रतिबंधित करना चाहते हैं, इसका उपयोग कर सकते हैं । ( प्रलेखन )

result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)

अपनी आवश्यकताओं के आधार पर, आप आस्थगित उपयोगी भी पा सकते हैं । वे आपको पूर्ण वस्तु को वापस करने की अनुमति देते हैं लेकिन तार पर आने वाले कॉलम को प्रतिबंधित करते हैं।


21
with_entities () कॉलम मानों के सभी () उपज ट्यूल बनाता है, न कि वस्तुएं!
कोलाप्टो

10
kolypto: यह पैदावार जो भी आप इसे उपज के लिए पूछें। SomeModel.query.with_entities (SomeModel) ऑब्जेक्ट का उत्पादन करेगा। सत्र.क्वेरी (SomeModel.col1, SomeModel.col2) की तरह ही स्तंभ मानों के ट्यूल का उत्पादन होगा। यदि आप तार पर आने वाले कॉलम नहीं चाहते हैं, तो Deferreds आप का उपयोग करेंगे, लेकिन आप वैसे भी पूरी वस्तु चाहते हैं।
डेविड मैककेन

2
धन्यवाद यह काम करता है। लेकिन हम क्षेत्र के लिए उपनाम कैसे दे सकते हैं? क्योंकि मेरे मामले में, मैं जोइन और संघर्ष IDक्षेत्र का उपयोग कर रहा हूं जो दोनों तालिका में मौजूद है
मितुल शाह

हाँ, मेरे पास @MitulShah के साथ एक ही सवाल है, उपनाम कैसे सेट करें?
नाम जी वीयू

उपनाम के लिए, इस संक्षिप्त उत्तर को नीचे देखें। का उपयोग .label() stackoverflow.com/a/11535992/248616
वियतनाम जी VU

69
session.query().with_entities(SomeModel.col1)

के समान है

session.query(SomeModel.col1)

उपनाम के लिए, हम .label () का उपयोग कर सकते हैं

session.query(SomeModel.col1.label('some alias name'))

2
दूसरा एक और अधिक तार्किक लगता है और कम है - जीत / जीत
fgblomqvist

7
आपका पहला कथन गलत है। आपको कोष्ठक की आवश्यकता है। तो, यह पढ़ना चाहिए:session.query().with_entities(SomeModel.col1)
JGFMK

पहले (और तीसरे) विकल्प सबसे अच्छे हैं, अब तक, यदि आप मौजूदा क्वेरी ऑब्जेक्ट का पुन: उपयोग करना चाहते हैं, विशेष रूप से कई जटिल उपश्रेणियाँ करने के मामले में।
जेमी स्ट्रॉस

36

आप load_only फ़ंक्शन का उपयोग कर सकते हैं :

from sqlalchemy.orm import load_only

fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()

1
यह समाधान सबसे अच्छा है क्योंकि यह अभी भी एक वस्तु के रूप में काम कर रहा है न केवल परिणामों की सूची।
rborodinov

इस समाधान के लिए आप के लिए यश। इसके कई फायदे हैं: - बिल्कुल उसी प्रकार की वस्तु पर वापस लौटें जैसे ( .first()और .one()आलसी / उत्सुक भार क्षेत्रों और संबंधों), - इसे क्वेरी घटक के रूप में सेट किया जा सकता है
डेमियन

कोड साफ है, लेकिन sql क्वेरी डेटाबेस से सभी फ़ील्ड्स का चयन करता है। मैंने with_entitiesस्वीकार किए गए उत्तर में दिए गए और क्वेरी का उपयोग केवल उस फ़ील्ड / के रूप में किया है।
श्रीकांत जीव

11

आप उपयोग कर सकते हैं Model.query, क्योंकि Model(या आमतौर पर इसका आधार वर्ग, विशेष रूप से ऐसे मामलों में जहां घोषणात्मक विस्तार का उपयोग किया जाता है) को सौंपा गया है Sesssion.query_property। इस मामले में Model.queryसमतुल्य है Session.query(Model)

मुझे क्वेरी द्वारा लौटाए गए कॉलम को संशोधित करने के तरीके के बारे में पता नहीं है (अधिक उपयोग जोड़कर add_columns())।
तो आपका सबसे अच्छा शॉट Session.query(Model.col1, Model.col2, ...)(जैसा कि सलिल द्वारा पहले ही दिखाया गया है) का उपयोग करना है।


मेरा मानना ​​है कि क्वेरी मानों () के लिए कॉलमों की एक सूची के साथ ऐसा करने का एक तरीका भी हो सकता है, docs.sqlalchemy.org/en/latest/orm/… - लेकिन सूची के लिए सिंटैक्टिक चीनी इस समय मुझे हटा देती है।
JGFMK


-11

एक उदाहरण यहाँ:

movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()

मैं रेटिंग <> 0 वाली फिल्मों के लिए db को क्वेरी करता हूं, और फिर मैं उन्हें पहले higest रेटिंग के साथ रेटिंग करके ऑर्डर करता हूं।

यहां एक नज़र डालें : फ्लास्क-एसक्यूएलकेमी में सेलेक्ट, इंसर्ट, डिलीट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.