Разница между запросом в sqlalchemy и прямым sqlite - PullRequest
0 голосов
/ 09 сентября 2018

Я испытываю некоторую странную разницу между запросом, использующим 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...