คอลัมน์แท็กมีค่าเช่น "apple banana orange" และ "strawberry banana lemon" ฉันต้องการค้นหาคำสั่งเทียบเท่า SQLAlchemy กับ
SELECT * FROM table WHERE tags LIKE "%banana%";
ฉันควรผ่านClass.query.filter()
อะไรเพื่อทำสิ่งนี้?
คอลัมน์แท็กมีค่าเช่น "apple banana orange" และ "strawberry banana lemon" ฉันต้องการค้นหาคำสั่งเทียบเท่า SQLAlchemy กับ
SELECT * FROM table WHERE tags LIKE "%banana%";
ฉันควรผ่านClass.query.filter()
อะไรเพื่อทำสิ่งนี้?
คำตอบ:
คอลัมน์แต่ละคนมีวิธีการที่สามารถนำมาใช้ในการlike()
query.filter()
ระบุสตริงการค้นหาเพิ่ม%
อักขระที่ด้านใดด้านหนึ่งเพื่อค้นหาเป็นสตริงย่อยในทั้งสองทิศทาง
tag = request.form["tag"]
search = "%{}%".format(tag)
posts = Post.query.filter(Post.tags.like(search)).all()
tags
ตารางที่คุณเก็บชื่อแท็กและข้อมูลแท็กอื่น ๆ และคุณจะมีtask_tags
ตารางซึ่ง จะมีหนึ่งระเบียนสำหรับแต่ละแท็กที่เพิ่มลงในงาน ดังนั้นงานที่มี 2 แท็กจะมี 2 ระเบียนในtask_tags
ตาราง
การเพิ่มคำตอบข้างต้นใครก็ตามที่กำลังมองหาวิธีแก้ปัญหาคุณสามารถลองใช้ตัวดำเนินการ "จับคู่" แทน "ชอบ" ได้ ไม่ต้องการที่จะลำเอียง แต่มันทำงานได้ดีสำหรับฉันใน Postgresql
Note.query.filter(Note.message.match("%somestr%")).all()
สืบทอดฟังก์ชันฐานข้อมูลเช่นCONTAINSและMATCH MATCHอย่างไรก็ตามไม่มีใน SQLite
สำหรับข้อมูลเพิ่มเติมไปที่Common Filter Operators
to_tsquery
ซึ่งช่วยให้คุณสามารถเพิ่มตัวดำเนินการข้อความสำหรับสิ่งต่างๆเช่นOR
และAND
postgresql.org/docs/current/…
ลองใช้รหัสนี้
output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + < email > + '%'))
การใช้ PostgreSQL like
( ดูคำตอบที่ยอมรับด้านบน ) อย่างใดก็ไม่ได้ผลสำหรับฉันแม้ว่าจะมีกรณีที่ตรงกันแต่ilike
(กรณีที่ฉันไม่อ่อนไหวเช่น ) ทำ
ILIKE
เป็นเวอร์ชันที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่LIKE
ดังนั้นอินพุตของคุณจึงแตกต่างกันในกรณีเท่านั้น
หากคุณใช้ SQL แบบเนทีฟคุณสามารถอ้างถึงโค้ดของฉันมิฉะนั้นก็ไม่สนใจคำตอบของฉัน
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()