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 ?
Réponses
Trop de publicités?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
ydb.table.column
est pourSQLSoup
( 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))
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 "%" .
@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.