SQLAlchemy按降序排列?


424

如何descending在如下所示的SQLAlchemy查询中使用ORDER BY ?

此查询有效,但以升序返回:

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

如果我尝试:

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

然后我得到:NameError: global name 'desc' is not defined

Answers:


692

与FYI一样,您也可以将这些内容指定为列属性。例如,我可能已经做过:

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

这很方便,因为它避免了import,并且可以在其他地方(例如关系定义等)中使用它。

有关更多信息,您可以参考此


28
它还避免了import
Capi Etheriel 2015年

1
是否有对此的API参考,知道其他可用的方法会很酷?
约翰·麦克

谢谢这个。官方文档中似乎缺少该文件。
user3341078

1
最好的响应(目前)。
罗德里金


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

来自@ jpmc26的用法


15
用法:(someselect.order_by(desc(table1.mycol))取自文档。)...因为我在您的问题中没有注意到它。
jpmc26 2014年

1
文档有一个新的网址
拥抱

73

您可能要做的另一件事是:

.order_by("name desc")

这将导致:ORDER BY名称desc。这里的缺点是按顺序使用显式列名。


25
这是一种潜在的脆弱解决方法,不需要解决方法。
BlueBomber 2013年

13
但是,如果由于任何原因在字符串中都有sort列,则很好(例如,Web API中经过过滤的输入)。
Jim Stewart

19
作为后续操作,getattr(MyModelClass, column_string).desc()如果您有字符串,也可以这样做。
吉姆·斯图尔特

9
@JimStewart,为了传递方向,我最终使用了:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
如果您已标记输出并按计算列而不是模型列进行排序,也可以使用此方法
boatcoder

28

您可以.desc()像这样在查询中使用函数

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

这将按金额降序排列,或者

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

使用SQLAlchemy的desc函数

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

对于官方文档,请使用链接或检查以下代码段

sqlalchemy.sql.expression.desc(column)产生一个降序的ORDER BY子句元素。

例如:

from sqlalchemy import desc

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

将产生如下SQL:

SELECT id, name FROM user ORDER BY name DESC

desc()函数是ColumnElement.desc()方法的独立版本,可用于所有SQL表达式,例如:

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

参数column –一个ColumnElement(例如标量SQL表达式),用于应用desc()操作。

也可以看看

asc()

nullsfirst()

nullslast()

Select.order_by()



12

你可以试试: .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答案的补充,与SQL一样,如果您有许多具有相同属性的表,则可以在参数中添加表名。

.order_by("TableName.name desc")

这不是需要用text()包装字符串吗?
Glutexo

请注意,它会导致SQLAlchemy> 1.3中的错误,并在较低版本中发出警告
Checo R
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.