এসকিউএল "লাইক" স্টেটমেন্টের সমতুল্য এসকিউএলএলকেমি


87

একটি ট্যাগ কলামে "আপেল কলা কমলা" এবং "স্ট্রবেরি কলা লেবু" এর মতো মান রয়েছে। আমি SQLAlchemy সমতুল্য বিবৃতিটি খুঁজতে চাই statement

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

এটি করার Class.query.filter()জন্য আমার কী পাস করা উচিত ?

উত্তর:


177

প্রতিটি কলামে like()পদ্ধতি রয়েছে যা ব্যবহার করা যেতে পারে query.filter()। একটি অনুসন্ধান স্ট্রিং দেওয়া হয়েছে, %উভয় দিকের একটি স্ট্রিং হিসাবে অনুসন্ধান করতে উভয় পক্ষের একটি অক্ষর যুক্ত করুন।

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

4
পারফেক্ট! আপনি কী জানেন যে কোনও শীর্ষস্থান যোগ করার চেয়ে আপেল এবং আনারসের মধ্যে পার্থক্য করার আরও ভাল উপায় আছে কি?
গ্যারি ওল্ড ফ্যাবার

4
সর্বোত্তম উপায় হ'ল কেবল আপনার ডাটাবেসকে সাধারণকরণ করা এবং ট্যাগ এবং ট্যাগ-টু-টাস্ক সম্পর্কের জন্য পৃথক 2 টি টেবিল যুক্ত করা এবং তারপরে লাইকের পরিবর্তে জোয়িনগুলি ব্যবহার করা। অন্যথায়, হ্যাঁ, মনে হচ্ছে আপনার স্ট্রিংয়ের প্রতিটি ট্যাগের চারপাশে কোনও না কোনও বিভাজক থাকতে হবে। শীর্ষস্থান স্থান যথেষ্ট নয়, যেহেতু% কলম% সহ পেন এবং পেন্সিল রয়েছে। আপনি যদি "| আপেল | আনারস | কলম | পেন্সিল |" এর মতো কিছু করেন তবে এবং "% | কলম |%" এর সাথে এটি মিলবে না coll
ড্যানিয়েল ক্লুয়েভ

4
সাধারণকরণের সাথে, আমি কীভাবে কোনও প্রদত্ত টাস্কের সাথে একাধিক ট্যাগ যুক্ত করব বা উল্টো ট্যাগ মানচিত্রটি ব্যবহার করব তা আমি নিশ্চিত নই। "টক্সি" সমাধানটি প্রতিটি স্বতন্ত্রভাবে সংরক্ষণের পরিবর্তে একক আইটেম হিসাবে ট্যাগগুলির সংগ্রহকে গোষ্ঠীভূত করে? এবং এই ( elixir.ematia.de/trac/wiki/Recines/TagCloud ) রেসিপিতে ব্যবহৃত পদ্ধতিটি প্রতি আইটেমটিতে কেবল একটি ট্যাগকে মঞ্জুরি দেয়। এই বিষয়টি ব্যাখ্যা করার জন্য কোন সংস্থানগুলি সবচেয়ে ভাল হবে? আমি এটি ( dev.mysql.com/tech-resources/articles/… ) খুব পড়েছি , তবে কীভাবে একাধিক ট্যাগ পরিচালনা করা যায় তা চিত্রায়ন করতে পারি না।
গ্যারি ওল্ড ফ্যাবার 15

4
আমি যেমন বলেছি, আপনার দুটি টেবিলের দরকার। মূলত, এটির কেবলমাত্র একাধিক-সম্পর্কিত সম্পর্ক, তাই আপনি এটিতে এসকিউএএলএলএক্মির নির্দেশিকাটি অনুসরণ করতে পারেন: sqlalchemy.org/docs/… আপনার tagsটেবিল থাকবে, যেখানে আপনি ট্যাগের নাম এবং অন্যান্য ট্যাগের তথ্য সঞ্চয় করবেন এবং আপনার কাছে task_tagsটেবিল থাকবে, যা টাস্কে যুক্ত প্রতিটি ট্যাগের জন্য একটি করে রেকর্ড থাকবে। সুতরাং 2 ট্যাগ সহ টাস্কটিতে কেবল 2 টি রেকর্ড থাকবে task_tags
ড্যানিয়েল ক্লিউভ

12

উপরের উত্তরে যোগ করা, যে কেউ সমাধানের সন্ধান করে, আপনি 'লাইক' না দিয়ে 'ম্যাচ' অপারেটরটি চেষ্টা করতে পারেন। পক্ষপাতদুষ্ট হতে চাই না তবে পোস্টগ্র্রেসক্লিতে এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে।

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

এটা তোলে ডাটাবেসের ফাংশন যেমন উত্তরাধিকারী হিসাবে উপস্থিত আছে এবং ম্যাচ । তবে এটি এসকিউএলাইটে উপলভ্য নয়।

আরও তথ্যের জন্য কমন ফিল্টার অপারেটর যান


8
এই দুই অপারেটরের মধ্যে পার্থক্য কী?
বুটজ

@buhtz আপনার ডিবি ব্যাকএন্ড দেখতে এসকিউএল রসায়ন ডক্স নির্ভর করে: docs.sqlalchemy.org/en/14/core/... Postgres আপনি পেতে to_tsqueryআপনি ভালো জিনিস জন্য পাঠ্য অপারেটার যোগ করতে দেয় যা ORএবং AND postgresql.org/docs/current/...
নিক


1

পোস্টগ্রিসএসকিউএল ব্যবহার করে like( উপরে গৃহীত উত্তর দেখুন ) কেসগুলি মিলে গেলেও কোনওভাবে আমার পক্ষে কাজ করেনি , তবে ilike(কেস আমি সংবেদনশীলের মতো ) করি না।


4
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()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.