Я пытаюсь выбрать подмножество столбцов из таблицы с функцией load_only
. К сожалению, кажется, что он не возвращает только столбцы, указанные в функциональном вызове - в частности, он также извлекает первичный ключ (в моем случае, поле 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
- и есть ли способ удалить его?
Задержка первичного ключа не имеет смысла, если запрашивать полные сущности ORM, потому что сущность должна иметь идентичность, чтобы уникальная строка могла быть идентифицирована в таблице базы данных. Таким образом, запрос включает в себя первичный ключ, хотя у вас есть load_only()
. Если вы хотите только данные, вы должны запросить это специально:
session.query(table.col1, table.col2).all()
Результатом являются кортежи с ключами, которые вы можете обрабатывать так же, как и объекты во многих случаях.
На самом деле была проблема, при которой load_only()
действительно удаляла первичный ключ из списка выбора, и это было исправлено в 0.9.5:
[orm] [bug] Изменено поведение
orm.load_only()
, так что столбцы первичного ключа всегда добавляются в список столбцов, которые нужно "отстать"; в противном случае ORM не может загрузить идентичность строк. По-видимому, можно отложить сопоставленные первичные ключи, и ORM потерпит неудачу, которая не была изменена. Но поскольку load_only в сущности говорит "отложить все, кроме X", более важно, чтобы столбцы PK не были частью этой отсрочки.
table.col1
) - не оба. Я думаю, что я попробовал нечто подобное ранее.load_only
сjoinedload
. Именно тогда я понял, что первичный ключ возвращался (видел идентификатор из обеих соединяемых таблиц при получении). ... Вопрос был своего рода "минимальным примером", показывающим функциюload_only
возвращающую первичный ключ.