У стовпці тегів є такі значення, як "яблучний банан апельсин" і "полуничний банан лимон". Я хочу знайти еквівалент оператора 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()