SQLAlchemy: выбор столбцов объекта в запросе - PullRequest
17 голосов
/ 08 августа 2011

Можно ли контролировать, какие столбцы запрашиваются в методе запроса SQLAlchemy, при этом возвращая экземпляры запрашиваемого объекта (хотя и частично заполненные)?

Или SQLAlchemy необходимо выполнить SELECT * для сопоставления с объектом?

(я знаю, что доступны запросы к отдельным столбцам, но он не отображает результат в объект, а только в компонент именованного кортежа).

Например, если объект User имеет атрибуты userid, name, password и bio, но вы хотите, чтобы запрос заполнял только userid и name для возвращаемых объектов:

# hypothetical syntax, of course:
for u in session.query(User.columns[userid, name]).all():
    print u

напечатает:

<User(1, 'bob', None, None)> 
<User(2, 'joe', None, None)>
...

Возможно ли это; если да, то как?

Ответы [ 3 ]

17 голосов
/ 08 августа 2011

вы можете запросить отдельные столбцы, которые возвращают именованные кортежи, которые на самом деле действуют почти как ваш сопоставленный объект, если вы просто передаете шаблон или что-то еще:

http://www.sqlalchemy.org/docs/orm/tutorial.html#querying

или вы можете установить различные столбцы в сопоставленном классе как «отложенные», либо в конфигурации, либо с использованием параметров:

http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#deferred-column-loading

в trac есть старый билет на что-то, называемое defer_everything_but (), если кто-то испытывает желание предоставить тесты, и поэтому нет причин, по которым нельзя добавить функцию, вот быстрая версия:

from sqlalchemy.orm import class_mapper, defer
def defer_everything_but(entity, cols):
    m = class_mapper(entity)
    return [defer(k) for k in 
            set(p.key for p 
                in m.iterate_properties 
                if hasattr(p, 'columns')).difference(cols)]

s = Session()
print s.query(A).options(*defer_everything_but(A, ["q", "p"]))

defer () должен действительно принимать кратные значения, для этого добавлен тикет # 2250 (редактировать: как отмечено в комментарии, это в 0,9 как load_only () )

9 голосов
/ 29 января 2017

Простое решение, которое работало для меня, было:

users = session.query(User.userid, User.name)
for user in users:
    print user

напечатало бы:

<User(1, 'bob')> 
<User(2, 'joe')>
...
3 голосов
/ 23 марта 2015

Последний документ для load_only здесь

http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#load-only-cols

Если вы ищете способ управления этим на уровне определения модели, используйте deferred

http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#deferred

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