SQLalchemy «load_only» не загружает только указанные столбцы

1

Я пытаюсь выбрать подмножество столбцов из таблицы с функцией 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 - и есть ли способ удалить его?

Теги:
sqlalchemy

1 ответ

0

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

  • 0
    Спасибо - но когда я делаю это, я получаю только первый столбец (то есть table.col1 ) - не оба. Я думаю, что я попробовал нечто подобное ранее.
  • 0
    Вероятно, следует указать - изначально пытался load_only с joinedload . Именно тогда я понял, что первичный ключ возвращался (видел идентификатор из обеих соединяемых таблиц при получении). ... Вопрос был своего рода "минимальным примером", показывающим функцию load_only возвращающую первичный ключ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню