Я испытываю некоторую странную разницу между запросом, использующим sqlalchemy, и другим, когда я пишу его непосредственно в какой-либо инструмент запросов, такой как Браузер БД для SQLite (ubuntu).
У меня есть одинтаблица с 6+ столбцами и хотите запросить 3 столбца, которые соответствуют некоторым фильтрам.Используя sqlalchemy ORM-запрос, я получил ноль строк, но, выполнив его в DB Browser, получил ожидаемый результат.Я печатаю SQL-запрос, скомпилированный sqlalchemy, копирую и вставляю в браузер БД, тот же результат (ноль в python и правильный результат в браузере БД)
Итак, для быстрого исправления я запрашиваю всю таблицу (просто3 столбца) и используйте if id in query_result
как оператор, чтобы проверить, существует ли он, и извлечь соответствующие данные.Пока это работает, но неэффективно.
Я пробовал следующие варианты:
# Attempt A
query_result = session.query(Table.id, Table.column_a, Table.column_b). \
filter(Table.id.in_(1, 2, 3)).all()
# SELECT Table.id, Table.column_a, Table.column.b
# FROM Table WHERE Table.id IN (1, 2, 3)
# Attempt B
ids_to_search = (1, 2, 3)
query_result = [session.query(Table.id, Table.column_a, Table.column_b). \
filter(Table.id == x).first() for x in ids_to_search]
# SELECT Table.id, Table.column_a, Table.column.b
# FROM Table WHERE Table.id = :x
Но всегда возвращаю None
Приведенные выше комментарии с комментариями возвращают ожидаемые строкиесли я выполню его в браузере БД для SQLite.
Исправление, которое я использую:
query_result = session.query(Table.id, Table.column_a, Table.column_b). \
all()
for id_to_search in (1, 2, 3):
for column_id, column_a, column_b in query_result:
if column_id == id_to_search:
do_some_stuff()
Это дает ожидаемый результат.
Конверт имел:
- python 3.6.6
- sqlalchemy 1.2.2
- sqlite3 2.6.0