У стовпці тегів є такі значення, як "яблучний банан апельсин" і "полуничний банан лимон". Я хочу знайти еквівалент оператора SQLAlchemy
SELECT * FROM table WHERE tags LIKE "%banana%";
На що мені перейти, Class.query.filter()
щоб зробити це?
У стовпці тегів є такі значення, як "яблучний банан апельсин" і "полуничний банан лимон". Я хочу знайти еквівалент оператора 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
таблиці.
Додавши до наведеної вище відповіді, той, хто шукає рішення, також може спробувати оператор "match" замість "like". Не хочу бути упередженим, але це прекрасно спрацювало для мене в Postgresql.
Note.query.filter(Note.message.match("%somestr%")).all()
Він успадковує такі функції бази даних, як CONTAINS та MATCH . Однак він недоступний у SQLite.
Для отримання додаткової інформації перейдіть до Загальних операторів фільтрів
to_tsquery
який дозволяє додавати текстові оператори для таких речей , як OR
і AND
postgresql.org/docs/current / ...
Використання PostgreSQL like
( див. Прийняту відповідь вище ) якось не працювало для мене, хоча випадки збігалися , але ilike
(case i nsensisitive like ) працює.
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()