web-dev-qa-db-fra.com

Elixir/SQLAlchemy équivalent à l'instruction SQL "LIKE"?

J'utilise le schéma de type MySQLicious décrit here pour un système de marquage simple . J'ai lu quelques implémentations alternatives du schéma de marquage dans 4 threads SO différents, et cela répond mieux à mes besoins.

Une collection d'entrées porte les balises "pomme banane orange" et "citron fraise banane" et j'essaie de trouver l'instruction équivalente Elixir/SQLAlchemy de

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

Je n'ai pas été capable de trouver un tel moyen de structurer une commande Class.query.filter/filter_by (), et je ne vois pas de méthode similaire dans la documentation de l'un ou l'autre module. Y a-t-il un moyen simple de faire cela? Ou devrais-je simplement utiliser du SQL brut.

Question supplémentaire: Un inconvénient du schéma MySQLicious est le cas où je souhaiterai peut-être rechercher "% Apple%" mais avoir "ananas" renvoyé. Existe-t-il un moyen très efficace de traiter ce cas de test? Ou devrais-je simplement inclure un espace de début dans chaque requête?

n.B: Pour ceux qui s’en soucient, c’est ma première expérience avec les bases de données, il est donc possible que je passe à côté des avantages fondamentaux du schéma mentionné dans d’autres discussions. Mon application permet de consigner une phrase ou deux sur une tâche terminée, avec des colonnes [TaskID, Balises, Notes, Heure de début, Heure d'arrêt, TimeTaken], un peu comme un simple journal. Principalement à des fins de tutorat. Je veux pouvoir rechercher par balises individuelles pour savoir approximativement combien de temps je passe sur une tâche donnée.

58
Gary Oldfaber

Chaque colonne a une méthode .like, qui peut être utilisée comme clause de filtre.

>>> Note.query.filter(Note.message.like("%somestr%")).all()
[]
106
Daniel Kluev

En ajoutant à la réponse ci-dessus, quiconque cherche une solution, vous pouvez également essayer l'opérateur "correspondance" au lieu de "comme". Je ne veux pas être partial, mais cela a parfaitement fonctionné pour moi dans Postgresql.

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

Il hérite des fonctions de base de données telles que CONTIENT et MATCH. Cependant, il n'est pas disponible dans SQLite.

Pour plus d'informations, allez Opérateurs de filtres communs

6
igsm

essayez ce code

output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + < email > + '%'))
5
waruna k

Utiliser PostgreSQL like ( voir réponse acceptée ci-dessus ) ne m'a pas fonctionné, bien que les cas soient identiques, mais ilike (cas i nsensisitive like) fonctionne.

0
konstantin