Используя SQLAlchemy, легко получить все строки, где данный столбец начинается с данной строки. Но как мне перевернуть его, чтобы получить строки, где начало строки совпадает со столбцом?

Т.е., если строка "stackoverflow", я бы хотел, чтобы она соответствовала строке со значением "stack"

При необходимости я могу хранить регулярные выражения в столбце, а не только в строке, но я также не знаю, как инвертировать сравнение регулярных выражений.

2
shader 25 Янв 2013 в 19:16

2 ответа

Лучший ответ

Здесь решение SQL реализовано в виде выражения sqlalchemy

class Foo(Base):
    __tablename__="foo_tablename"
    bar = Column(String(80))

bar = 'stackoverflow'
session.query(Foo).filter(literal('stackoverflow').like(func.concat(Foo.bar, '%')))

Журнал SQLAlchemy показывает сгенерированный запрос:

>>INFO sqlalchemy.engine.base.Engine SELECT bar FROM foo_tablename WHERE :param1 LIKE CONCAT(foo_tablename.bar_column,'%')
>>INFO sqlalchemy.engine.base.Engine {'param1': 'stack'}

Пожалуйста, обратите внимание:

  • Такой тип SQL-запроса не позволяет базе данных использовать индекс столбца - поэтому это потенциальное узкое место в производительности.

Поэтому, если мне потребуется добавить такую функциональность в производство, я бы подумал об использовании функции полнотекстового поиска, предоставляемой базой данных. SQLAlchemy не обеспечивает поддержку полнотекстового поиска, поскольку это специфическая функциональность базы данных. Смотрите пример объединения полнотекстового поиска PostgreSQL с SQLAlchemy .

Обновлено

Пользователь Audrius Kažukauskas предложил, как избавиться от необработанного sql. Таким образом, это снимает ограничения на использование литерального SQL,

2
Community 23 Май 2017 в 12:33

Может быть, есть лучший способ, но это должно работать:

bar = 'stackoverflow'
session.query(Foo).filter(
    Foo.data.in_([bar[:i] for i in xrange(5, len(bar) + 1)])
)
0
Audrius Kažukauskas 25 Янв 2013 в 16:16