【问题标题】:SQLAlchemy order by column name (not value)SQLAlchemy 按列名排序(不是值)
【发布时间】:2020-11-21 09:41:28
【问题描述】:

在 SQLalchemy 中,我知道您可以按列的值排序,但如何按名称(或引用)排序?

例如

class Users(db.Model):
    gamma = db.Column(db.Integer)
    alpha = db.Column(db.Integer)
    beta = db.Column(db.Integer)

如果我有值 1、2、3,我知道如何 order_by 对它们进行排序。如果我愿意呢

[alpha, beta, gamma]

最终目标是将其放入 OrderedDict 中,这样我每次都可以以相同的顺序访问它们。

我没有找到任何解决此问题的文档或 stackoverflow 问题。谢谢

【问题讨论】:

  • 我想始终按字母顺序返回结果,以便我可以将它们转换为向量并执行问题。因此,如果条目是 {alpha : 2, beta : 3, gamma : 1} 我可以始终将它们转换为 [2, 3, 1] 并始终按名称的字母顺序接收列。

标签: python sqlalchemy


【解决方案1】:

使用基本 sqlalchemy,您可以像这样在查询中指定列顺序

users = session.query(User.alpha, User.beta, User.gamma).all()

使用flask-sqlalchemy,您需要通过SQLAlchemy 对象访问会话,如下所示:

db = SQLAlchemy(app)
...
users = db.session.query(User.alpha, User.beta, User.gamma).all()

在任何一种情况下,结果列表中的每个“行”都将包含在query(...) 中指定的顺序的值

要结合检索对象和构建有序字典,您可以这样做

from collections import OrderedDict

users = User.query.all()
data = [OrderedDict([(c.name, getattr(u, c.name)) for c in
                     sorted(u.__table__.columns, key=lambda col: col.name)])
        for u in users]

在创建OrderedDicts 时按列名对属性进行排序。

【讨论】:

    【解决方案2】:

    据我了解,如何将列放入 OrderedDict,为什么不尝试使用 sorted() 对其进行排序,或者您可以在数据库模型上手动排列列,这样会更容易。

    from collections import OrderedDict
    column = {1: 'gamma', 2: 'alpha', 3: 'beta'}
    dict = OrderedDict(sorted(column.items(), key=lambda t: t[1]))
    print(dict)
    

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多