Flask SQLAlchemyクエリ、列名を指定


125

モデルを使用してクエリに必要な列を指定するにはどうすればよいですか(デフォルトではすべての列が選択されます)?sqlalchmeyセッションでこれを行う方法を知っていますが、session.query(self.col1)モデルでどのように行うのですか?できないよSomeModel.query()。方法はありますか?

回答:


220

with_entities()メソッドを使用して、結果で返す列を制限できます。(ドキュメント

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

要件によっては、遅延オブジェクトが役立つ場合もあります。それらはあなたが完全なオブジェクトを返すことを可能にしますが、ワイヤーを介して来る列を制限します。


21
with_entities()は、all()がオブジェクトではなく列値のタプルを生成するようにします!
kolypto 2014年

10
kolypto:それはあなたがそれを与えるように要求するものは何でも与えます。SomeModel.query.with_entities(SomeModel)はオブジェクトを生成します。同様に、session.query(SomeModel.col1、SomeModel.col2)は列値のタプルを生成します。据え置きは、列を介して列を取得したくないが、とにかくオブジェクト全体が必要な場合に使用します。
David McKeone 14

2
ありがとうございます。しかし、どのようにフィールドにエイリアスを割り当てることができますか?私の場合、ID両方のテーブルにあるJOINと競合フィールドを使用しているため
Mitul Shah

ええ、@ MitulShahと同じ質問があります。エイリアスの設定方法は?
Nam G VU

エイリアスについては、以下の簡単な回答をご覧ください。.label() stackoverflow.com/a/11535992/248616を
Nam G VU

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

と同じです

session.query(SomeModel.col1)

エイリアスには.label()を使用できます

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

2
2つ目はどちらもより論理的に聞こえ、短い— win / win
fgblomqvist

7
あなたの最初の発言は間違っています。括弧が必要です。だから、それは読んでください:session.query().with_entities(SomeModel.col1)
JGFMK

特に複数の複雑なサブクエリを実行する場合に、既存のクエリオブジェクトを再利用する場合は、1番目(および3番目)のオプションが断然最善です。
ジェイミーシュトラウス

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()(これは遅延/熱心なロードフィールドとリレーションになります)-クエリコンポーネントとして設定できます
Damien

コードはクリーンですが、SQLクエリはデータベースからすべてのフィールドを選択します。私はwith_entities受け入れられた回答で与えられたとおりに使用し、クエリはそのフィールドのみを選択しました
Srikanth Jeeva

11

を使用できるのはModel.queryModel(または通常はその基本クラス、特に宣言型拡張機能が使用されている場合)が割り当てられているためSesssion.query_propertyです。この場合、Model.queryはと同等Session.query(Model)です。

クエリによって返された列を変更する方法を知りません(を使用してさらに追加する場合を除くadd_columns())。
だからあなたのベストショットはSession.query(Model.col1, Model.col2, ...)(すでにサリルが示したように)を使うことです。


クエリの値の列のリストを使用してこれを行う方法もあると思います()、docs.sqlalchemy.org / en / latest / orm /… -しかし、現時点では、リストの構文糖は私にはわかりません。
JGFMK 2018


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.