Estoy construyendo una consulta utilizando SQLAlchemy y SQLite3 en el que me gustaría seleccionar filas en las que una columna de cadena contiene una subcadena particular. Cuál es la mejor manera de lograr esto?
Filtrar por db.table.column.like('%needle%')
. También existe una búsqueda insensible a mayúsculas y minúsculas.
Para una interfaz más elegante puede permitir los comodines conocidos “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))
Notas:
db.table.filter
y db.table.column
es para SQLSoup
( SQLSoup es útil si la base de datos fue creada por otra aplicación) select(column_list).where(table.c.column.ilike(expr))
. Esta interfaz es el camino a seguir cuando desea obtener todo el poder del SQL en bruto sin tener que componer sentencias a mano mediante la interpolación de cadenas (utilícela junto con SQLSoup para la introspección, por lo que no necesita declarar tablas) Model.query.filter(Model.field.ilike(expr))
Prueba esto
Model.query.filter(Model.columnName.contains('sub_string'))
Si bien table.c.column.like("%...%")
debería funcionar, hay una forma más directa de decir lo que quiere:
table.c.column.contains("needle")
Esto generalmente generará la misma consulta SQL, pero es mejor leer para los no iniciados. Tenga en cuenta que parece que contiene no se escapa “_” y “%” .
@app.route('/', methods=['GET']) def getdb(var): look_for = '%{0}%'.format(var) log1 = table.query.filter(table.col.like(look_for))
He usado SQLAlchemy y Flask (app.ruta en la parte superior es un decorador). Usé la API get para tomar la variable que el usuario desea buscar y la estoy convirtiendo para almacenarla en otra variable llamada look_for (ya que var no se puede usar directamente en la consulta) usando el formato () y log1 almacena las tuplas consultadas.