2010-07-24 4 views
42

मैं एक सरल टैगिंग सिस्टम के लिए here वर्णित MySQLicious प्रकार स्कीमा का उपयोग कर रहा हूं। मैंने 4 अलग-अलग SO धागे में टैगिंग स्कीमा के कुछ वैकल्पिक कार्यान्वयन पढ़े हैं, और यह मेरी आवश्यकताओं को सर्वोत्तम रूप से उपयुक्त बनाता है।एलिक्सीर/स्क्लाक्लेमी एसक्यूएल "LIKE" कथन के बराबर है?

प्रविष्टियों का एक संग्रह टैग "सेब केला नारंगी" और "स्ट्रॉबेरी केले नींबू" है, और मुझे

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

को अमृत/SQLAlchemy बराबर बयान लगता है मैं नहीं कर पाए हैं कोशिश कर रहा हूँ Class.query.filter/filter_by() कमांड को बनाने के लिए ऐसा कोई तरीका ढूंढने के लिए, और मॉड्यूल के लिए प्रलेखन में एक समान विधि नहीं देख सकता है। क्या ऐसा करने के लिए एक सरल तरीका है? या मैं सिर्फ कच्चे एसक्यूएल का उपयोग करना चाहिए।

अतिरिक्त प्रश्न: MySQLicious स्कीमा का एक नुकसान वह मामला है जहां मैं "% सेब%" खोजना चाहता हूं लेकिन "अनानस" लौटा है। क्या इस टेस्ट केस से निपटने के लिए एक उच्चस्तरीय तरीका है? या क्या मुझे बस प्रत्येक क्वेरी में एक प्रमुख स्थान शामिल करना चाहिए?

एनबी: उन लोगों के लिए जो डाटाबेस के साथ मेरा पहला अनुभव है, इसलिए मैं अन्य धागे में वर्णित स्कीमा के मूल फायदे देख सकता हूं। मेरा आवेदन कॉलम [टास्क आईडी, टैग, नोट्स, स्टार्टटाइम, स्टॉपटाइम, टाइमटेकन] के साथ, एक साधारण जर्नल की तरह एक कार्य पूरा करने के बारे में वाक्य या दो को लॉगिंग करने के लिए है। अधिकतर ट्यूटोरियल उद्देश्यों के लिए। मैं अलग-अलग टैग्स द्वारा खोज करने में सक्षम होना चाहता हूं कि यह पता लगाने के लिए कि मैं किसी दिए गए कार्य पर कितना समय व्यतीत करता हूं।

+0

कोशिश "यहाँ" टैग 404 :( – David

उत्तर

75

प्रत्येक कॉलम में .like विधि है, जिसे फ़िल्टर क्लॉज के रूप में उपयोग किया जा सकता है।

>>> Note.query.filter(Note.message.like("%somestr%")).all() 
[] 
+1

बिल्कुल सही की ओर जाता है! आप जानते हैं कि सेब के बीच अंतर करने के लिए एक बेहतर तरीका है करो और एक अग्रणी स्थान जोड़ने से अनानास? –

+2

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

+1

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

4

ऊपर जवाब देने के लिए जोड़ा जा रहा है, जो कोई भी लग समाधान के लिए, आप इसके बजाय 'की तरह' के 'मैच' ऑपरेटर की कोशिश कर सकते हैं। पक्षपातपूर्ण नहीं होना चाहते हैं लेकिन यह Postgresql में मेरे लिए पूरी तरह से काम किया।

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

यह डेटाबेस कार्यों को विरासत में इस तरह के रूप शामिल हैं और मैच। हालांकि, यह SQLite में उपलब्ध नहीं है।

जाना अधिक जानकारी के लिए Common Filter Operators

+0

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

2

इस कोड

output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + <email> + '%'))