python - 通过按列值选择 SqlAlchemy 创建字典组

标签 python mysql sql json sqlalchemy

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

例如:

我的模型类是

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

我的 table 是

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 来完成此任务?

谢谢!

最佳答案

如果您使用的是足够新的 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()

关于python - 通过按列值选择 SqlAlchemy 创建字典组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63580267/

相关文章:

python - Numpy astype 四舍五入到错误的值

mysql - MySQL 中限制子级数量的约束

c# - 如何在从中选择的表发生变化的 ADO.NET 中安全地创建查询?

python - 在 Matplotlib 中显示所有 xlabels 和 xticks

python - 将级别附加到 pandas MultiIndex

python - 如何在 Python 3 中测试所有可迭代对象是否为真

php - 这个 php 脚本中会发生太多连接吗? (mysql_select_db)

mysql - 将信息保存在文件中而不是 mysql 查询是否有助于提高性能并节省资源?

mysql - 用于获取订单状态的复杂 SQL 查询

php - 查询AS时mysql查询报错