【问题标题】:SQLAlchemy ORDER BY DESCENDING?SQLAlchemy 按降序排列?
【发布时间】:2011-05-10 07:42:04
【问题描述】:

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

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

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

【问题讨论】:

  • 从 sqlalchemy 导入 desc from sqlalchemy import desc

标签: python sqlalchemy


【解决方案1】:

仅供参考,您还可以将这些内容指定为列属性。例如,我可能已经这样做了:

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

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

更多信息可以参考这个SQLAlchemy 1.4 Documentation

【讨论】:

  • 是否有这方面的 API 参考,知道还有什么可用的会很酷吗?
  • 谢谢你。官方文档中似乎缺少它。
  • 最佳响应(目前)。
  • sqlalchemy orm 文档对我来说是个谜,我自己在里面找不到任何东西。谢谢@dzervas
【解决方案2】:
from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

Usage 来自@jpmc26

【讨论】:

【解决方案3】:

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

.order_by("name desc")

这将导致:ORDER BY name desc。这里的缺点是 order by 使用的显式列名。

【讨论】:

  • 这是一个潜在的脆弱的解决方法,不需要解决方法。
  • 如果您出于任何原因在字符串中包含排序列,这很好,不过(如 Web API 中的净化输入)。
  • 作为后续,如果您有字符串,您也可以使用getattr(MyModelClass, column_string).desc()
  • @JimStewart 和我最终使用的方向传递:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
  • 如果您已标记输出并按计算列而不是模型列排序,您也可以使用它
【解决方案4】:

您可以像这样在查询中使用.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)
)
)

官方文档请使用link或查看下方sn-p

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

Parameters column – 一个 ColumnElement(例如标量 SQL 表达式) 哪个应用 desc() 操作。

另见

asc()

nullsfirst()

nullslast()

Select.order_by()

【讨论】:

【解决方案5】:

你可以试试:.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()

【讨论】:

    【解决方案6】:

    @Radu 回答的补充,与 SQL 一样,如果您有多个具有相同属性的表,则可以在参数中添加表名。

    .order_by("TableName.name desc")
    

    【讨论】:

    • 这不需要用 text() 包裹字符串吗?
    • 注意它会在 SQLAlchemy >1.3 中导致错误,在较低版本中会出现警告
    猜你喜欢
    • 2012-10-18
    • 2012-09-30
    • 2012-03-06
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多