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.