【问题标题】:Create dictionary groups from select SqlAlchemy by column value从按列值选择 SqlAlchemy 创建字典组
【发布时间】:2020-12-14 05:29:30
【问题描述】:

我需要从表格中选择所有行,并按列my_group 分组。

例如:

我的模型类是

class MyTable:
    id = Column(Integer, primary_key=True)
    label = Column(Unicode(255))
    my_group = Column(Unicode(50), nullable=False)

我的桌子是

id | label | my_group |
 1 | lbl1  | groupA   |
 2 | lbl2  | groupB   |  
 3 | lbl3  | groupA   |
 4 | lbl4  | groupC   |
 5 | lbl5  | groupC   |

我想要这样的结果

[
    {
        "groupA": [
            {
                "label": "lbl1", 
                "id": 1
            },
            {
                "label": "lbl3", 
                "id": 3
            }
        ]
    },
    {
        "groupB": [
            {
                "label": "lbl2", 
                "id": 2
            }
        ]
    },
    {
        "groupC": [
            {
                "label": "lbl4", 
                "id": 4
            },
            {
                "label": "lbl5", 
                "id": 5
            }
        ]
    }
]

是否可以仅使用 SqlAlchemy 完成此操作?

谢谢!

【问题讨论】:

  • 您使用的是什么 DBMS?
  • 是 MySQL,@IljaEverilä

标签: python mysql sql json sqlalchemy


【解决方案1】:

如果您使用的是最新版本的 MySQL,5.7.22 及更高版本,您可以使用JSON functions 来产生所需的结果:

from sqlalchemy.dialects.mysql import JSON

query = session.query(
        func.json_object(
            MyTable.my_group, func.json_arrayagg(
                func.json_object(
                    'label', MyTable.label,
                    'id', MyTable.id)),
            type_=JSON)).\
    group_by(MyTable.my_group)

result = [r for r, in query]

如果您确实需要组字典,可以包装分组查询:

sq = session.query(
        MyTable.my_group,
        func.json_arrayagg(
            func.json_object(
                'label', MyTable.label,
                'id', MyTable.id)).label('arr')).\
    group_by(MyTable.my_group).\
    subquery()

result = session.query(
        func.json_objectagg(
            sq.c.my_group, sq.c.arr,
            type_=JSON)).\
    scalar()

【讨论】:

  • 谢谢,我的 MySQL 版本太旧了 :( 目前我使用这种格式,这是我的作品。groups = session.query(MyTable.my_group) \ .distinct(MyTable.my_group).all() my_dict = {} for (g,) in groups: my_dict[g] = session.query(MyTable.id, MyTable.label) \ .filter(MyTable.my_group == g) \ .all()
猜你喜欢
  • 1970-01-01
  • 2015-05-07
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多