SQLAlchemy SİPARİŞ VEREN Mİ?


424

ORDER descendingBY'ı aşağıdaki gibi bir SQLAlchemy sorgusunda nasıl kullanabilirim ?

Bu sorgu çalışır, ancak bunları artan sırada döndürür:

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

Eğer denersem:

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

Sonra olsun: NameError: global name 'desc' is not defined.

Yanıtlar:


693

Tıpkı bir FYI gibi, bunları sütun özellikleri olarak da belirtebilirsiniz. Örneğin, ben yapmış olabilir:

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

Bu, a'yı önlediğinden importve ilişki tanımı vb.Gibi diğer yerlerde kullanabileceğiniz için kullanışlıdır .

Daha fazla bilgi için şunları yapabilirsiniz Bu bakınız


28
aynı zamanda bir import.
— Capi Etheriel

1
Bunun için bir API referansı var mı, başka neler olduğunu bilmek harika olurdu?
— John Mike

Bunun için teşekkürler. Resmi belgelerde eksik gibi görünüyor.
— user3341078

1
En iyi yanıt (şu anda).
— RodriKing



73

Yapabileceğiniz başka bir şey:

.order_by("name desc")

Bunun sonucu: ORDER BY name desc. Buradaki dezavantaj, sırayla kullanılan açık sütun adıdır.


25
Bu, bir geçici çözümün gerekli olmadığı potansiyel olarak kırılgan bir çözümdür.
— BlueBomber

13
Bununla birlikte, herhangi bir nedenden ötürü bir dizede sıralama sütunu varsa güzeldir (bir web API'sındaki sterilize edilmiş giriş gibi).
— Jim Stewart

19
Takip olarak, bir dizeniz getattr(MyModelClass, column_string).desc()varsa da yapabilirsiniz .
— Jim Stewart

9
@JimStewart ve yön geçmek için kullanarak sona erdi:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
— Tjorriemorrie

1
Çıktınızı etiketlediyseniz ve bir model sütunu yerine hesaplanmış bir sütuna göre
— sıralıyorsanız bunu kullanabilirsiniz

28

.desc()Sorgunuzdaki işlevi şu şekilde kullanabilirsiniz

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

Bu, azalan sırada veya

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

SQLAlchemy'nin desc fonksiyonunun kullanımı

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

Resmi dokümanlar için lütfen bağlantıyı kullanın veya aşağıdaki snippet'i kontrol edin

sqlalchemy.sql.expression.desc (sütun) Azalan ORDER BY yan tümcesi öğesi oluşturun.

Örneğin:

from sqlalchemy import desc

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

SQL'i şu şekilde üretecektir:

SELECT id, name FROM user ORDER BY name DESC

Desc () işlevi, tüm SQL ifadelerinde kullanılabilen ColumnElement.desc () yönteminin bağımsız bir sürümüdür, örneğin:

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

Parametreler sütunu - desc () işleminin uygulanacağı bir ColumnElement (örn. Skaler SQL ifadesi).

Ayrıca bakınız

Artan ()

nullsfirst ()

nullslast ()

Select.order_by ()



12

Deneyebilirsin: .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 yanıtında tamamlayıcı, SQL'de olduğu gibi, aynı özniteliğe sahip birçok tablonuz varsa parametreye tablo adını ekleyebilirsiniz.

.order_by("TableName.name desc")

Bu, dizeyi text () ile sarmayı gerektirmez mi?
— Glutexo

SQLAlchemy> 1.3'te bir hataya, daha düşük sürümlerde bir uyarıya neden olduğuna dikkat edin
— Checo R
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.