SQLAlchemy где значение в списке столбцов - PullRequest
0 голосов
/ 28 декабря 2018

Прежде чем переместить мой код в SQLAlchemy, у меня есть запрос MySQL, который ищет значение в нескольких столбцах (например, - WHERE 'value' in (col1, col2)), который прекрасно работает при отправке запроса вручную в базу данных.

Использованиеописанный выше случай относительно прост, но в будущем я могу захотеть выполнить аналогичный запрос для более чем двух столбцов, поэтому просто хочу опередить эту проблему сейчас.

В настоящее время я преобразовал свой запрос в приведенный ниже (который работает), но я пытаюсь найти синтаксис, подобный приведенному выше.

metadata = sqlalchemy.MetaData(mydb, reflect=True)
select_stmt = (tbl_pbp.select(
              ((tbl_pbp.c.home_team == team_abbreviation) | (tbl_pbp.c.away_team == team_abbreviation))
              & (tbl_pbp.c.is_corsi == True)))

Когда я пытаюсь описать ниже, я получаю синтаксическую ошибку, поэтому не уверен, что это проблема с in_ ключевое слово, которое я пытаюсь использовать.

metadata = sqlalchemy.MetaData(mydb, reflect=True)
select_stmt = (tbl_pbp.select(
              (team_abbreviation in_(tbl_pbp.c.home_team, tbl_pbp.c.away_team)
              & (tbl_pbp.c.is_corsi == True)))

Любая помощь очень ценится - спасибо!

1 Ответ

0 голосов
/ 31 декабря 2018

Чтобы работать со значением Python как литералом SQL в языке выражений SQL , оно должно быть заключено в literal().Результирующая конструкция может затем использоваться для получения желаемого предложения IN:

literal(team_abbreviation).in_([tbl_pbp.c.home_team, tbl_pbp.c.away_team])

Это эквивалентно созданию набора проверок на равенство в сочетании с OR, как отмечено в комментариях.Единственный аргумент in_() должен быть подходящей последовательностью, такой как список, в этом случае.

Обратите внимание, что in_ здесь это метод изконструкция SQLAlchemy, а не оператор Python in, которая не может быть перегружена для создания пользовательских конструкций из-за того, как она обрабатывает возвращаемое значение __contains__(): она неявно преобразуется в bool:

In [1]: class X:
   ...:     def __contains__(self, item):
   ...:         return 'nope'
   ...:     

In [2]: 1 in X()
Out[2]: True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...