SQLAlchemy SQL "LIKE" स्टेटमेंट के बराबर है


85

एक टैग कॉलम में "सेब केला नारंगी" और "स्ट्रॉबेरी केला नींबू" जैसे मूल्य हैं। मैं SQLAlchemy के समकक्ष कथन खोजना चाहता हूं

SELECT * FROM table WHERE tags LIKE "%banana%";

इसे करने के Class.query.filter()लिए मुझे क्या करना चाहिए ?

जवाबों:


173

प्रत्येक स्तंभ में like()विधि है, जिसका उपयोग किया जा सकता है query.filter()। एक खोज स्ट्रिंग को देखते हुए, %दोनों दिशाओं में एक विकल्प के रूप में खोज करने के लिए दोनों ओर एक चरित्र जोड़ें ।

tag = request.form["tag"]
search = "%{}%".format(tag)
posts = Post.query.filter(Post.tags.like(search)).all()

1
उत्तम! क्या आप जानते हैं कि एक प्रमुख स्थान जोड़ने की तुलना में सेब और अनानास के बीच अंतर करने का एक बेहतर तरीका है?
गैरी ओल्डफैबर

3
सबसे अच्छा तरीका होगा कि आप अपने डेटाबेस को सामान्य करें और टैग और टैग-टू-टास्क संबंधों के लिए 2 अलग-अलग टेबल जोड़ें और फिर LIKE के बजाय JOINs का उपयोग करें। अन्यथा, हां, ऐसा लगता है जैसे आपको स्ट्रिंग में प्रत्येक टैग के चारों ओर किसी प्रकार का विभाजक रखना होगा। अग्रणी स्थान पर्याप्त नहीं है, क्योंकि पेन और पेंसिल भी है,% पेन% के साथ। अगर आप कुछ ऐसा करते हैं "| सेब | अनानास | कलम | पेंसिल |" और "% | पेन |%" से मेल खाना चाहिए।
डैनियल क्लेव

1
सामान्य करने के साथ, मुझे पूरा यकीन नहीं है कि मैं किसी दिए गए कार्य के साथ जुड़े एक से अधिक टैग कैसे लगाऊंगा, या टैग मानचित्र का उपयोग करके इसके विपरीत। "टोक्सी" समाधान व्यक्तिगत रूप से संग्रहीत करने के बजाय, एकल आइटम के रूप में टैग के संग्रह को समूह में प्रकट करता है? और इस में प्रयुक्त विधि ( elixir.ematia.de/trac/wiki/Recipes/TagCloud ) नुस्खा केवल एक टैग प्रति आइटम की अनुमति देता है। इस विषय को स्पष्ट करने के लिए कौन से संसाधन सर्वोत्तम होंगे? मैंने इसे ( dev.mysql.com/tech-resources/articles/… ) भी पढ़ा है, लेकिन कई टैग प्रबंधित करने का तरीका नहीं दिखा सकता।
गैरी ओल्डफैबर

2
जैसा कि मैंने कहा, आपको दो तालिकाओं की आवश्यकता है। मूल रूप से, इसका केवल विशिष्ट कई-से-कई संबंध है, इसलिए आप इस पर SQLAlchemy के मार्गदर्शक का अनुसरण कर सकते हैं: sqlalchemy.org/docs/… आपके पास tagsतालिका होगी , जहां आप टैग नाम और अन्य टैग जानकारी संग्रहीत करते हैं, और आपके पास task_tagsतालिका होगी , जो टास्क में जोड़े गए प्रत्येक टैग के लिए एक रिकॉर्ड होगा। इसलिए 2 टैग वाले कार्य में task_tagsतालिका में केवल 2 रिकॉर्ड होंगे ।
डैनियल क्लेव

11

उपरोक्त उत्तर को जोड़ते हुए, जो कोई भी समाधान खोजता है, आप 'जैसे' के बजाय 'मैच' ऑपरेटर को भी आज़मा सकते हैं। पक्षपाती नहीं होना चाहते लेकिन यह पूरी तरह से मेरे लिए Postgresql में काम करता है।

Note.query.filter(Note.message.match("%somestr%")).all()

यह डेटाबेस कार्यों जैसे CONTAINS और MATCH को विरासत में मिला है । हालाँकि, यह SQLite में उपलब्ध नहीं है।

अधिक जानकारी के लिए कॉमन फ़िल्टर ऑपरेटर्स जाएं


8
इन दोनों ऑपरेटरों के बीच अंतर क्या है?
buhtz

@buhtz अपने डीबी बैकएंड देखने एसक्यूएल-कीमिया डॉक्स पर निर्भर करता है: docs.sqlalchemy.org/en/14/core/... Postgres में आप मिल to_tsqueryतुम जैसी चीजों के लिए पाठ ऑपरेटरों जोड़ने देता है जो ORऔर AND postgresql.org/docs/current/...
निक


1

PostgreSQL का उपयोग करते हुए like( ऊपर स्वीकार किए जाते हैं जवाब देखने के ) किसी भी तरह काम नहीं किया था मेरे लिए हालांकि मामलों का मिलान नहीं हुआ है, लेकिन ilike(मामले मैं nsensisitive की तरह ) है।


2
ILIKEकेस-असंवेदनशील संस्करण है LIKE, इसलिए आपके इनपुट केवल मामले में भिन्न हैं।
मार्टिन पीटर्स

0

यदि आप मूल वर्ग का उपयोग करते हैं, तो आप मेरे कोड का उल्लेख कर सकते हैं, अन्यथा केवल मेरे उत्तर को अनदेखा करें।

SELECT * FROM table WHERE tags LIKE "%banana%";
from sqlalchemy import text

bar_tags = "banana"

# '%' attention to spaces
query_sql = """SELECT * FROM table WHERE tags LIKE '%' :bar_tags '%'"""

# db is sqlalchemy session object
tags_res_list = db.execute(text(query_sql), {"bar_tags": bar_tags}).fetchall()

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