Kolumna tagów zawiera wartości takie jak „jabłko-banan-pomarańcza” i „truskawka-banan-cytryna”. Chcę znaleźć równoważną instrukcję SQLAlchemy
SELECT * FROM table WHERE tags LIKE "%banana%";
Co mam przejść, aby Class.query.filter()
to zrobić?
Kolumna tagów zawiera wartości takie jak „jabłko-banan-pomarańcza” i „truskawka-banan-cytryna”. Chcę znaleźć równoważną instrukcję SQLAlchemy
SELECT * FROM table WHERE tags LIKE "%banana%";
Co mam przejść, aby Class.query.filter()
to zrobić?
Odpowiedzi:
Każda kolumna ma like()
metodę, której można użyć w query.filter()
. Mając wyszukiwany ciąg, dodaj %
znak po obu stronach, aby wyszukiwać jako podciąg w obu kierunkach.
tag = request.form["tag"]
search = "%{}%".format(tag)
posts = Post.query.filter(Post.tags.like(search)).all()
tags
tabelę, w której będziesz przechowywać nazwę znacznika i inne informacje o znaczniku, a także task_tags
tabelę, która będzie miał jeden rekord dla każdego tagu dodanego do zadania. Zatem zadanie z 2 tagami będzie miało tylko 2 rekordy w task_tags
tabeli.
Dodając do powyższej odpowiedzi, ktokolwiek szuka rozwiązania, możesz również spróbować operatora „dopasuj” zamiast „lubię”. Nie chcę być stronniczy, ale w Postgresql to działało idealnie.
Note.query.filter(Note.message.match("%somestr%")).all()
Dziedziczy funkcje bazy danych, takie jak CONTAINS i MATCH . Jednak nie jest dostępny w SQLite.
Więcej informacji można znaleźć w sekcji Wspólne operatory filtrów
to_tsquery
który pozwala dodawać operatory tekstowe dla rzeczy takich jak OR
i AND
postgresql.org/docs/current/ ...
Korzystanie z PostgreSQL like
( Akceptowane odpowiedź powyżej ) jakoś nie działa na mnie chociaż przypadki dopasowane , ale ilike
(przypadek I nsensisitive jak ) robi.
ILIKE
jest wersją programu bez rozróżniania wielkości liter LIKE
, więc dane wejściowe różniły się tylko w przypadku.
Jeśli używasz natywnego sql, możesz odwołać się do mojego kodu, w przeciwnym razie po prostu zignoruj moją odpowiedź.
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()