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.

AP257
sumber

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

Rick
sumber
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

AP257
sumber
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.

Radu
sumber
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 ()

anand tripathi
sumber
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()
Artem Baranov
sumber
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")
Michael
sumber
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