SQLAlchemy 按降序排列?
Posted
技术标签:
【中文标题】SQLAlchemy 按降序排列?【英文标题】:SQLAlchemy ORDER BY DESCENDING? 【发布时间】: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 导入 descfrom sqlalchemy import desc
【参考方案1】:
仅供参考,您还可以将这些内容指定为列属性。例如,我可能已经这样做了:
.order_by(model.Entry.amount.desc())
这很方便,因为它避免了import
,您可以在其他地方使用它,例如在关系定义等中。
更多信息可以参考这个SQLAlchemy 1.4 Documentation
【讨论】:
是否有这方面的 API 参考,知道还有什么可用的会很酷吗? 谢谢你。官方文档中似乎缺少它。 最佳响应(目前)。 @JohnMike docs.sqlalchemy.org/en/latest/core/… sqlalchemy orm 文档对我来说是个谜,我自己在里面找不到任何东西。谢谢@dzervas【参考方案2】:from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))
Usage 来自@jpmc26
【讨论】:
文档有一个new url【参考方案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()
【讨论】:
这不是***.com/a/4187279/2718295的副本【参考方案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 中导致错误,在较低版本中会出现警告以上是关于SQLAlchemy 按降序排列?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Firebase 中按降序排列数据 - Python