Задайте запрос SQLAlchemy, укажите имена столбцов

Как мне указать столбец, который я хочу в своем запросе, используя модель (по умолчанию выбираются все столбцы)? Я знаю, как это сделать с помощью сеанса sqlalchmey: session.query(self.col1), но как мне это сделать с моделями? Я не могу сделать SomeModel.query(). Есть ли способ?

Ответ 1

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

result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)

В зависимости от ваших требований вы также можете найти отложенные. Они позволяют вам возвращать полный объект, но ограничивают столбцы, которые попадают на провод.

Ответ 2

session.query().with_entities(SomeModel.col1)

такой же, как

session.query(SomeModel.col1)

для псевдонима мы можем использовать .label()

session.query(SomeModel.col1.label('some alias name'))

Ответ 3

Вы можете использовать функцию load_only :

from sqlalchemy.orm import load_only

fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()

Ответ 4

Вы можете использовать Model.query, потому что Model (или обычно его базовый класс, особенно в тех случаях, когда используется декларативное расширение) присваивается Sesssion.query_property. В этом случае Model.query эквивалентно Session.query(Model).

Мне неизвестно, как изменить столбцы, возвращаемые запросом (за исключением добавления большего использования add_columns()).
Поэтому лучше всего использовать Session.query(Model.col1, Model.col2, ...) (как уже было показано Салилом).

Ответ 5

Вы можете использовать Query.values, Query.values

session.query(SomeModel).values('id', 'user')

Ответ 6

Пример:

movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()

Я запрашиваю db для фильмов с рейтингом < > 0, а затем заказываю их по рейтингу с самым высоким рейтингом в первую очередь.

Посмотрите здесь: Выбрать, Вставить, Удалить в Flask-SQLAlchemy