SQLAlchemy降順で注文しますか?


424

descending次のようなSQLAlchemyクエリでORDER BYを使用するにはどうすればよいですか?

このクエリは機能しますが、昇順に返します。

query = (model.Session.query(model.Entry)
        .join(model.ClassificationItem)
        .join(model.EnumerationValue)
        .filter_by(id=c.row.id)
        .order_by(model.Entry.amount) # This row :)
        )

私が試した場合:

.order_by(desc(model.Entry.amount))

それから私は得る:NameError: global name 'desc' is not defined

回答:


693

参考までに、列属性としてそれらを指定することもできます。たとえば、私はしたかもしれません:

.order_by(model.Entry.amount.desc())

これはを回避するので便利importであり、リレーション定義などの他の場所でも使用できます。

詳細については、これを参照できます


28
それはまた避けますimport
Capi Etheriel、2015

1
これのAPIリファレンスはありますか、他に何が利用可能かを知るのはクールでしょうか?
ジョンマイク

これをありがとう。公式ドキュメントにはないようです。
user3341078

1
(現時点で)最高の応答。
RodriKing



73

あなたがするかもしれないもう一つのことは:

.order_by("name desc")

これにより、ORDER BY name descになります。ここでの欠点は、順番に使用される明示的な列名です。


25
これは、回避策を必要としない、脆弱な可能性のある回避策です。
BlueBomber 2013年

13
これは、何らかの理由で(Web APIのサニタイズされた入力のように)文字列にソート列がある場合に便利です。
ジムスチュワート

19
フォローアップとして、あなたがgetattr(MyModelClass, column_string).desc()文字列を持っている場合にも行うことができます。
ジムスチュワート

9
@JimStewartと方向を渡すために私は次のように使用しました:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
出力にラベルを付け、モデル列ではなく計算列で並べ替えている場合も、これを使用できます
boatcoder

28

.desc()このようにクエリで関数を使用できます

query = (model.Session.query(model.Entry)
        .join(model.ClassificationItem)
        .join(model.EnumerationValue)
        .filter_by(id=c.row.id)
        .order_by(model.Entry.amount.desc())
        )

これは、金額の降順または

query = session.query(
    model.Entry
).join(
    model.ClassificationItem
).join(
    model.EnumerationValue
).filter_by(
    id=c.row.id
).order_by(
    model.Entry.amount.desc()
)
)

SQLAlchemyのdesc関数の使用

from sqlalchemy import desc
query = session.query(
    model.Entry
).join(
    model.ClassificationItem
).join(
    model.EnumerationValue
).filter_by(
    id=c.row.id
).order_by(
    desc(model.Entry.amount)
)
)

公式ドキュメントについては、リンクを使用するか、以下のスニペットを確認してください

sqlalchemy.sql.expression.desc(column)降順のORDER BY句要素を生成します。

例えば:

from sqlalchemy import desc

stmt = select([users_table]).order_by(desc(users_table.c.name))

SQLは次のように生成されます。

SELECT id, name FROM user ORDER BY name DESC

desc()関数は、すべてのSQL式で使用可能なColumnElement.desc()メソッドのスタンドアロンバージョンです。

stmt = select([users_table]).order_by(users_table.c.name.desc())

パラメータcolumn – desc()操作を適用するColumnElement(例:スカラーSQL式)。

こちらもご覧ください

asc()

nullsfirst()

nullslast()

Select.order_by()



12

あなたが試すことができます: .order_by(ClientTotal.id.desc())

session = Session()
auth_client_name = 'client3' 
result_by_auth_client = session.query(ClientTotal).filter(ClientTotal.client ==
auth_client_name).order_by(ClientTotal.id.desc()).all()

for rbac in result_by_auth_client:
    print(rbac.id) 
session.close()

0

@Raduで補足、SQLと同様に、同じ属性を持つテーブルが多数ある場合は、パラメータにテーブル名を追加できます。

.order_by("TableName.name desc")

これはtext()で文字列をラップする必要はありませんか?
Glutexo

SQLAlchemy> 1.3でエラーが発生することに注意してください。下位バージョンでは警告
Checo R
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.