Запит на колбу SQLAlchemy, вкажіть назви стовпців


125

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

Відповіді:


220

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

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

Залежно від ваших вимог, ви також можете вважати відкладеними корисні. Вони дозволяють повернути повний об'єкт, але обмежують стовпці, що надходять через провід.


21
with_entities () змушує всі () давати кортежі значень стовпців, а не об'єкти!
колипто

10
kolypto: Це дає все, що ви попросите, щоб він дав урожай. SomeModel.query.with_entities (SomeModel) дасть об'єкт. Так само, як session.query (SomeModel.col1, SomeModel.col2) дасть кортежі значень стовпців. Відкладені - це те, що ви використовуєте, якщо ви не хочете, щоб стовпці надходили через провід, але ви хочете, щоб весь об'єкт все одно.
Девід Маккеоне

2
Спасибі це працює. Але як ми могли призначити псевдонім для поля? Тому що в моєму випадку я використовую JOIN та IDполе конфлікту, яке присутнє в обох таблицях
Mitul Shah

Так, у мене те саме питання з @MitulShah, як встановити псевдонім?
Нам Г ВУ

Для псевдоніма дивіться цю коротку відповідь нижче, тобто. використовуйте .label() stackoverflow.com/a/11535992/248616
Нам G VU

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

те саме, що

session.query(SomeModel.col1)

для псевдоніма ми можемо використовувати .label ()

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

2
Другий звучить більш логічно і коротше - win / win
fgblomqvist

7
Ваше перше твердження неправильне. Вам потрібні дужки. Отже, слід прочитати:session.query().with_entities(SomeModel.col1)
JGFMK

Перший (і третій) параметри є найкращим, на сьогоднішній день, якщо ви хочете повторно використовувати існуючі об’єкти запитів, особливо у випадку виконання декількох складних підзапитів.
Джеймі Стросс

36

Ви можете використовувати функцію load_only :

from sqlalchemy.orm import load_only

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

1
Це рішення є найкращим, оскільки воно досі працює як Об'єкт не лише у списку результатів.
rborodinov

Кудо вам для цього рішення. Він має багато переваг: - повернути точно той же тип об'єкта, що .first()і .one()(що буде лінивим / нетерплячим навантажувати поля та відносини), - можна встановити як компонент запиту
Дамієн

код чистий, але запит sql вибирає всі поля з бази даних. Я використав, with_entitiesяк зазначено у прийнятій відповіді, і запит вибрав лише ці поля /.
Шрікант Єєва

11

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

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


Я вважаю, що також може бути спосіб зробити це зі списком стовпців для значень запитів (), також, docs.sqlalchemy.org/en/latest/orm/… - але синтаксичний цукор у списку ухиляється від мене на даний момент.
JGFMK


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.