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.