Нечувствительный к регистру фильтр массива any() в sqlalchemy

Я переношу некоторый код из SqlAlchemy 1.3 в SqlAlchemy 1.4 с Postgres 12. Я нашел запрос, который выглядит так:

session.query(Horse)
  .filter(Horse.nicknames.any("charlie", operator=ColumnOperators.ilike))

Тип столбца nicknamesColumn(ARRAY(String(64))).

Мне кажется, что это делает запрос любого Horse, чей один из их nicknames является charlie без учета регистра (ilike).

Этот код работает нормально в SqlAlchemy==1.3.0 и дает сбой в версии 1.4.40 со следующей ошибкой:

sqlalchemy.exc.UnsupportedCompilationError:
Compiler <sqlalchemy.dialects.postgresql.psycopg2.PGCompiler_psycopg2 object at 0x7fce54c80f10>
can't render element of type <function ColumnOperators.ilike at 0x7fce92944280>
(Background on this error at: https://sqlalche.me/e/14/l7de)

Каким был бы эквивалентный способ сделать это, который идеально подходит для обеих версий?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, этот запрос не работает в версии SQLAlchemy 1.3.20*. В 1.3.0 он сгенерировал этот SQL (псевдонимы удалены для ясности):

SELECT id, nicknames 
FROM horse
WHERE 'charlie' ILIKE ANY (nicknames)

В документах для any упоминается, что он был заменен any_, хотя, похоже, формально он не объявлен устаревшим. С этими знаниями мы можем создать альтернативу, которая генерирует тот же SQL:

import sqlalchemy as sa
...
session.query(Horse).filter(
    sa.literal('able').ilike(sa.any_(Horse.nicknames))
)

или в стиле 2.0:

sa.select(Horse).where(
    sa.literal('charlie').ilike(sa.any_(Horse.nicknames))
)

* Я ничего не вижу в примечаниях к выпуску относительно этого изменения в поведении, так что это может быть регрессией, но на данном этапе, вероятно, лучше использовать конструкцию any_.

это новое для меня, поэтому +1, тоже не ОП, но я хотел бы знать, можно ли также применить «начинает с» (вместо ilike) таким же образом? например: "любой элемент начинается с Foo"

python_user 12.02.2023 11:26

@python_user ответы здесь предполагают, что нет, или, по крайней мере, нелегко.

snakecharmerb 12.02.2023 12:04

Другие вопросы по теме