Эликсир / SQLAlchemy эквивалентно SQL-выражению "LIKE"? - PullRequest
64 голосов
/ 24 июля 2010

Я использую схему типов MySQLicious, описанную здесь для простой системы тегов.Я прочитал несколько альтернативных реализаций схемы тегирования в 4 различных SO-потоках, и это лучше всего подходит для моих нужд.

Коллекция записей содержит теги "apple banana orange" и "strawberry banana lemon", и япытаюсь найти оператор Elixir / SQLAlchemy, эквивалентный

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

Мне не удалось найти такой способ структурирования команды Class.query.filter / filter_by (), и я не могуСмотрите аналогичный метод в документации для любого модуля.Есть ли простой способ сделать это?Или я должен просто использовать сырой SQL.

Дополнительный вопрос: Недостатком схемы MySQLicious является случай, когда я могу захотеть найти «% apple%», но вернуть «pineapple».Есть ли высокоуровневый способ справиться с этим контрольным примером?Или я должен просто указать начальный пробел в каждом запросе?

nB: для тех, кому это интересно, это мой первый опыт работы с базами данных, поэтому я могу упускать из виду основные преимущества схемы, упомянутой в других потоках.Мое приложение предназначено для записи предложения или двух о выполненной задаче со столбцами [TaskID, Tags, Notes, StartTime, StopTime, TimeTaken], немного похожими на простой журнал.В основном для учебных целей.Я хочу иметь возможность поиска по отдельным тегам, чтобы приблизительно определить, сколько времени я трачу на выполнение определенного задания.

Ответы [ 4 ]

119 голосов
/ 24 июля 2010

Каждый столбец имеет метод .like, который можно использовать в качестве предложения фильтра.

>>> Note.query.filter(Note.message.like("%somestr%")).all()
[]
6 голосов
/ 07 июля 2015

В дополнение к ответу выше, кто бы ни ищет решение, вы также можете попробовать оператор «сопоставить» вместо «нравится». Не хочу быть предвзятым, но это прекрасно сработало для меня в Postgresql.

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

Он наследует функции базы данных, такие как CONTAINS и MATCH . Однако он недоступен в SQLite.

Для получения дополнительной информации перейдите Общие операторы фильтрации

5 голосов
/ 14 июня 2017

попробуйте этот код

output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + < email > + '%'))
0 голосов
/ 05 января 2019

Использование PostgreSQL like ( см. Принятый ответ выше ) как-то не работает для меня, хотя случаи совпадают, но ilike (случай i Нечувствительный , как ).

...