Запрос SQLAlchemy, где столбец содержит подстроку - PullRequest
24 голосов
/ 08 февраля 2011

Я строю запрос с использованием SQLAlchemy и SQLite3, в котором я хотел бы выбрать строки, в которых столбец String содержит определенную подстроку. Каков наилучший способ сделать это?

Ответы [ 4 ]

58 голосов
/ 29 октября 2013

Попробуйте это

Model.query.filter(Model.columnName.contains('sub_string'))
28 голосов
/ 08 февраля 2011

Фильтр по db.table.column.like('%needle%').Существует также ilike для поиска без учета регистра.

Для более необычного интерфейса вы можете использовать известные подстановочные знаки "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))

Примечания:

  • db.table.filter и db.table.column предназначены для SQLSoup ( SQLSoup полезен, если база данных была создана другим приложением)
  • для SQLAlchemy Core это select(column_list).where(table.c.column.ilike(expr)).Этот интерфейс удобен, когда вам нужна вся мощь от необработанного SQL без необходимости составлять операторы вручную с использованием интерполяции строк (используйте его для SQL-анализа для самоанализа, поэтому вам не нужно объявлять таблицы)
  • для декларативной SQLAlchemy (используемой во Flask) это Model.query.filter(Model.field.ilike(expr))
11 голосов
/ 08 августа 2011

Хотя table.c.column.like("%...%") должно работать, есть более прямой способ сказать, что вы хотите:

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

Обычно это генерирует тот же SQL-запрос, но лучше читать для непосвященных. Обратите внимание, что для содержимого не экранируются "_" и "%" .

1 голос
/ 03 мая 2018
@app.route('/<var>', methods=['GET'])
def getdb(var):
    look_for = '%{0}%'.format(var)
    log1 = table.query.filter(table.col.like(look_for))

Я использовал SQLAlchemy и Flask (app.route сверху - это декоратор). Я использовал API get для получения переменной, которую пользователь хочет найти, и я конвертирую эту переменную, чтобы сохранить ее в другой переменной под названием look_for (поскольку var нельзя использовать непосредственно в запросе) с помощью format () и В log1 хранятся запрошенные кортежи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...