Как мне указать столбец, который я хочу в своем запросе, используя модель (по умолчанию выбираются все столбцы)? Я знаю, как это сделать с помощью сеанса sqlalchmey: session.query(self.col1)
, но как мне это сделать с моделями? Я не могу сделать SomeModel.query()
. Есть ли способ?
Задайте запрос SQLAlchemy, укажите имена столбцов
Ответ 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