40 votes

Requête SQLAlchemy où une colonne contient une sous-chaîne

Je construis une requête en utilisant SQLAlchemy et SQLite3 dans laquelle je voudrais sélectionner les lignes dans lesquelles une colonne String contient une sous-chaîne particulière. Quelle est la meilleure façon d'y parvenir ?

81voto

kartheek Points 1251

Vous pouvez filtrer en utilisant contains opérateur :

Model.query.filter(Model.columnName.contains('sub_string'))

Pour annuler l'entrée, utilisez not_ opérateur avec elle :

Model.query.filter(not_(Model.columnName.contains('sub_string')))

47voto

Paulo Scardine Points 17518

Filtrer par db.table.column.like('%needle%') . Il y a également ilike pour une recherche insensible à la casse.

Pour une interface plus élaborée, vous pouvez utiliser les caractères génériques "dir".

if '*' in needle or '_' in needle: 
    looking_for = needle.replace('_', '__')\
                        .replace('*', '%')\
                        .replace('?', '_')
else:
    looking_for = '%{0}%'.format(needle)

result = db.table.filter(db.table.column.ilike(looking_for))

Notes :

  • El db.table.filter y db.table.column est pour SQLSoup ( SQLSoup est utile si la base de données a été créée par une autre application)
  • pour SQLAlchemy Core c'est select(column_list).where(table.c.column.ilike(expr)) . Cette interface est la solution lorsque vous souhaitez bénéficier de toute la puissance du SQL brut sans avoir à composer des instructions à la main en utilisant l'interpolation de chaînes de caractères (utilisez-la avec SQLSoup pour l'introspection, afin de ne pas avoir à déclarer de tables).
  • pour SQLAlchemy Declarative (celui utilisé dans Flask) c'est Model.query.filter(Model.field.ilike(expr))

15voto

Bluehorn Points 1016

Alors que table.c.column.like("%...%") devrait fonctionner, il existe un moyen plus direct de dire ce que vous voulez :

table.c.column.contains("needle")

Cela génère généralement la même requête SQL, mais il est préférable de la lire pour les non-initiés. Notez que contains ne semble pas échapper à "_" y "%" .

5voto

@app.route('/<var>', methods=['GET'])
def getdb(var):
    look_for = '%{0}%'.format(var)
    log1 = table.query.filter(table.col.like(look_for))

J'ai utilisé SQLAlchemy et Flask (app.route au dessus est un décorateur). J'ai utilisé l'API get pour prendre la variable que l'utilisateur souhaite rechercher et je convertis cette variable pour la stocker dans une autre variable appelée look_for (puisque var ne peut pas être utilisé directement dans la requête) en utilisant le format() et log1 stocke les tuples interrogés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X