REGEXP_LIKE в SQLAlchemy

Кто-нибудь знает, как я могу использовать эквивалент REGEXP_LIKE в SQLAlchemy? Например, я хотел бы сделать что-то вроде:

sa.Session.query(sa.Table).filter(sa.Table.field.like(regex-to match))

Спасибо за вашу помощь!

2
nl ja de

3 ответы

Он должен (я не имею доступа к Oracle) работать следующим образом:

sa.Session.query(sa.Table) \
          .filter(sa.func.REGEXP_LIKE(sa.Table.c.column, '[[:digit:]]'))
4
добавлено
func не имеет атрибута REGEXP_LIKE. Также в чем смысл .c.column? Это значит, что это поле? Я попробовал .field и .field.column, но не работает
добавлено автор Luigi Tiburzi, источник
PostgreSql ... но не был ли sqlAlchemy независимым от db?
добавлено автор Luigi Tiburzi, источник
Итак, нет надежды на соответствие регулярному выражению Oracle ???
добавлено автор Luigi Tiburzi, источник
Хорошо, спасибо за плохие новости :-)
добавлено автор Luigi Tiburzi, источник
Какую базу данных вы используете?
добавлено автор plaes, источник
Ох .. REGEXP_LIKE является специфичным для Oracle. Хотя SQLAlchemy очень тяжело работает с агностикой базы данных, она, к сожалению, не относится к специальной функциональности.
добавлено автор plaes, источник
Да, похоже, что большинство регулярных выражений, поддерживаемых PostgreSQL, еще не поддерживается SQLAlchemy

В случаях, когда вам нужно выполнить специфичную для базы данных функцию, которая не поддерживается SQLAlchemy, вы можете использовать литеральный фильтр. Таким образом, вы все равно можете использовать SQLAlchemy для создания запроса для вас - т. Е. Заботиться о соединениях и т. Д.

Вот пример того, как собрать литеральный фильтр с помощью оператора PostgeSQL Regex Matching ~

session.query(sa.Table).filter("%s ~':regex_pattern'" % sa.Table.c.column.name).params(regex_pattern='stack')

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

session.query(sa.Table).filter("table.column ~':regex_pattern'"  ).params(regex_pattern='[123]')
1
добавлено
Извините, но ваш ответ дает мне ошибку в regex_pattern. Правильно ли скобки указаны? Правильно ли table.column? Разве это не должно быть sa.Table.column? В любом случае получить ошибку даже в этом случае, но я не могу сказать, что это за ошибка, она говорит только синтаксическую ошибку (ProgrammingError) при или около "1"
добавлено автор Luigi Tiburzi, источник
Извините, я не понимаю, это мой запрос: sa.Session.query (sa.BaseApparati) .filter ("sa.BaseApparati.co & zwnj; lumn.nome ~ ': regex_pattern'") .params ( regex_pattern = '[123]'). все (). Имя таблицы «BaseApparati», а столбец «nome», что такое правильный ввод? Я все еще получаю «Ошибка программирования ...». благодаря
добавлено автор Luigi Tiburzi, источник
Кажется, что у вас есть путаница между табличными объектами и объектами ORM. В вашей модели ORM вы получаете доступ к полям ( obj.nome ), но для табличных объектов вам нужно использовать столбцы: obj.c.nome .
добавлено автор plaes, источник
Извините за опечатку. После regex_pattern не должно быть круглых скобок. См. Обновленную версию. Также в зависимости от типа sa.Table существуют разные способы получения столбца. Если это Table (..) , то пользователь sa.Table.c.column.name . Если это сопоставленный объект, то просто sa.Table.column.name
добавлено автор vvladymyrov, источник

Это не полностью переносимо, но вот решение Postgres, в котором используется оператор ~. Таким образом, мы можем использовать произвольные операторы:

sa.Session.query (sa.Table) .filter (sa.Table.field.op ('~', is_comparison = True) (соответствие регулярному выражению))

Или, если предположить, что приоритет по умолчанию равен 0,

sa.Session.query (sa.Table) .filter (sa.Table.field.op ('~', 0, True) (соответствие регулярному выражению))

Это также работает с конструкциями ORM:

sa.Session.query (SomeClass) .filter (SomeClass.field.op ('~', 0, True) (соответствие регулярному выражению))

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)