केस असंवेदनशील फ्लास्क-SQLAlchemy क्वेरी


96

मैं उपयोगकर्ताओं के डेटाबेस से क्वेरी करने के लिए फ्लास्क-SQLAlchemy का उपयोग कर रहा हूं; हालाँकि, जबकि

user = models.User.query.filter_by(username="ganye").first()

वापस होगा

<User u'ganye'>

करते हुए

user = models.User.query.filter_by(username="GANYE").first()

रिटर्न

None

मुझे आश्चर्य हो रहा है कि अगर केस को असंवेदनशील तरीके से डेटाबेस को क्वेरी करने का एक तरीका है, ताकि दूसरा उदाहरण अभी भी वापस आ जाए

<User u'ganye'>

जवाबों:


193

आप इसे lowerया तो upperअपने फ़िल्टर में या कार्यों का उपयोग करके कर सकते हैं :

from sqlalchemy import func
user = models.User.query.filter(func.lower(User.username) == func.lower("GaNyE")).first()

एक अन्य विकल्प ilikeइसके बजाय खोज का उपयोग करना है like:

.query.filter(Model.column.ilike("ganye"))

3
क्या यह उस filter_byविधि की तुलना में क्वेरी को धीमा कर देगा, जिसमें उपयोगकर्ता नाम स्तंभ को अनुक्रमित किया गया है?
कैप्टनडेविन

13

@ पट्टिका के उत्तर में सुधार करने पर, यह क्वेरी को छोटा कर देगा यदि आप केवल उस कॉलम को निर्दिष्ट करते हैं जिसकी आपको आवश्यकता है:

user = models.User.query.with_entities(models.User.username).\
filter(models.User.username.ilike("%ganye%")).all()

उपरोक्त उदाहरण बहुत ही उपयोगी है अगर किसी को AJAX के उद्देश्यों के लिए फ्लास्क के जेन्सिफ़ाइक का उपयोग करने की आवश्यकता होती है और फिर आपकी जावास्क्रिप्ट में इसे data.result का उपयोग करके एक्सेस किया जाता है :

from flask import jsonify
jsonify(result=user)

@ Vedran thanksego मैंने लिंक देखा है, संदर्भ के लिए धन्यवाद। मैं अपना टेस्ट भी कराऊंगा।
iChux

3

तुम कर सकते हो

user = db.session.query(User).filter_by(func.lower(User.username)==func.lower("GANYE")).first()

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

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()

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