ORDER SQLAlchemy DENGAN DESCENDING?


424

Bagaimana saya bisa menggunakan ORDER BY descendingdalam permintaan SQLAlchemy seperti berikut?

Kueri ini berfungsi, tetapi mengembalikannya dalam urutan naik:

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 :)
        )

Jika saya mencoba:

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

maka saya mendapatkan: NameError: global name 'desc' is not defined.

Jawaban:


694

Sama seperti FYI, Anda juga dapat menentukan hal-hal itu sebagai atribut kolom. Misalnya, saya mungkin telah melakukan:

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

Ini berguna karena menghindari import, dan Anda dapat menggunakannya di tempat lain seperti dalam definisi relasi, dll.

Untuk informasi lebih lanjut, Anda dapat merujuk ini


28
itu juga menghindari import.
Capi Etheriel

1
Apakah ada referensi API untuk ini, apakah akan keren untuk mengetahui apa lagi yang tersedia?
John Mike

Terima kasih untuk ini. Tampaknya itu hilang dari dokumentasi resmi.
user3341078

1
Respon terbaik (saat ini).
RodriKing


339
from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

Penggunaan dari @ jpmc26


15
Penggunaan: someselect.order_by(desc(table1.mycol))(Diambil dari dokumen .) ... karena saya sendiri tidak memperhatikannya dalam pertanyaan Anda.
jpmc26

1
Documents punya url
hughes baru

73

Satu hal lain yang mungkin Anda lakukan adalah:

.order_by("name desc")

Ini akan menghasilkan: ORDER BY name desc. Kerugian di sini adalah nama kolom eksplisit yang digunakan dalam urutan oleh.


25
Ini adalah solusi yang berpotensi rapuh di mana solusi tidak diperlukan.
BlueBomber

13
Ini bagus jika Anda memiliki kolom pengurutan dalam string karena alasan apa pun (seperti input yang disanitasi dalam API web).
Jim Stewart

19
Sebagai tindak lanjut, Anda juga dapat melakukannya getattr(MyModelClass, column_string).desc()jika Anda memiliki string.
Jim Stewart

9
@JimStewart dan untuk melewati arah saya akhirnya menggunakan:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
Anda juga dapat menggunakan ini jika Anda telah memberi label pada hasil Anda dan mengurutkannya dengan kolom yang dihitung alih-alih kolom model
boatcoder

28

Anda dapat menggunakan .desc()fungsi dalam permintaan Anda seperti ini

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

Ini akan memesan dengan jumlah dalam urutan menurun atau

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

Penggunaan fungsi desc dari SQLAlchemy

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)
)
)

Untuk dokumen resmi, silakan gunakan tautan atau periksa snippet di bawah ini

sqlalchemy.sql.expression.desc (kolom) Menghasilkan ORDER menurun DENGAN elemen klausa.

misalnya:

from sqlalchemy import desc

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

akan menghasilkan SQL sebagai:

SELECT id, name FROM user ORDER BY name DESC

Fungsi desc () adalah versi mandiri dari metode ColumnElement.desc () yang tersedia di semua ekspresi SQL, misalnya:

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

Kolom parameter - ColumnElement (mis. Ekspresi skalar SQL) yang digunakan untuk menerapkan operasi desc ().

Lihat juga

asc ()

nullsfirst ()

nullslast ()

Select.order_by ()


5
bagaimana ini bukan duplikat dari stackoverflow.com/a/4187279/2718295
cowbert

12

Anda dapat mencoba: .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

Pelengkap di @Radu jawaban, Seperti dalam SQL, Anda dapat menambahkan nama tabel dalam parameter jika Anda memiliki banyak tabel dengan atribut yang sama.

.order_by("TableName.name desc")

Tidakkah ini membutuhkan pembungkus string dengan teks ()?
Glutexo

Berhati-hatilah karena menyebabkan kesalahan pada SQLAlchemy> 1.3, peringatan dalam versi yang lebih rendah
Checo R
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.