SQLalchemy "load_only" не загружает только указанные столбцы - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь выбрать подмножество столбцов из таблицы с помощью функции load_only sqlalchemy. К сожалению, кажется, что он не возвращает только столбцы, указанные в функциональном вызове - в частности, он также извлекает первичный ключ (в моем случае, поле id auto_increment id).

Простой пример, если я использую этот оператор для построения запроса:

query = session.query(table).options(load_only('col_1', 'col_2'))

Тогда query.statement выглядит так:

SELECT "table".id, "table"."col_1", "table"."col_2" 
FROM "table"

Чего я не ожидал - учитывая, что я указал «только» столбцы для использования ... Откуда взялся id - и есть ли способ его удалить?

1 Ответ

0 голосов
/ 12 января 2019

Откладывание первичного ключа не имеет смысла, если запрашивать завершенные объекты ORM, потому что объект должен иметь идентификатор, чтобы уникальная строка могла быть идентифицирована в таблице базы данных . Таким образом, запрос включает первичный ключ, хотя у вас есть load_only(). Если вам нужны только данные, вам следует запросить их конкретно:

session.query(table.col1, table.col2).all()

Результатом являются кортежи с ключами, которые вы можете обрабатывать так же, как и объекты во многих случаях.

На самом деле возникла проблема , когда load_only() удалил первичный ключ из списка выбора , и он был исправлен в 0.9.5 :

[orm] [ошибка] Изменено поведение orm.load_only(), так что столбцы первичного ключа всегда добавляются в список столбцов, чтобы быть « undeferred»; в противном случае ORM не сможет загрузить идентификатор строки. По-видимому, можно отложить сопоставленные первичные ключи, и ORM потерпит неудачу, которая не была изменена. Но поскольку load_only в сущности говорит «отложить все, кроме X», более важно, чтобы столбцы PK не были частью этой отсрочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...