我可以将行/模型映射到由 SQLAlchemy 中的枚举列(或字符串列上的逻辑)键入的字典吗?

Posted

技术标签:

【中文标题】我可以将行/模型映射到由 SQLAlchemy 中的枚举列(或字符串列上的逻辑)键入的字典吗?【英文标题】:Can I map rows/models into a dictionary keyed by an enum column (or logic on a string column) in SQLAlchemy? 【发布时间】:2021-07-20 00:03:23 【问题描述】:

我有一个看起来像这样的表:

PERSON        | STATUS | ICE CREAM FLAVOR TYPE | FAVORITE ICE CREAM FLAVOR

Alice         | ALIVE  | CHOCOLATE             | Dark chocolate
Bobby         | ALIVE  | CHOCOLATE             | Mint chocolate
Olive         | DEAD   | BAD TASTE             | Vanilla
Hilbertonious | ALIVE  | BAD TASTE             | Mango strawberry

我想从中得到一个按冰淇淋口味按冰淇淋口味类型计算的活人数量。例如,对于上述数据,它将是:

 CHOCOLATE:  "Dark chocolate": 1, "Mint chocolate": 1  , BAD TASTE:  "Mango strawberry": 1 

(橄榄被排除在外,因为它们已经死了,大概是因为吃香草冰淇淋太无聊了)

无论如何,按状态过滤并按最喜欢的冰淇淋口味细分计数很简单(这是我目前所拥有的):

from collections import Counter
from a_sql_alchemy_wrapper.models import Person, Session

session = Session()
ice_cream_flavors_with_counts = Counter(
    person.favorite_ice_cream_flavor for patient in
    session.query(Person)
        .filter(
            Person.status == Person.PersonStatus.alive
        )
        .all()
    )

这让我有一种冰淇淋的味道来数字典:

 "Mint chocolate": 1, "Dark chocolate": 1, "Mango strawberry": 1

对于下一步,按冰淇淋口味类型分解冰淇淋口味,我是否可以用 Python 或 SQLAlchemy 编写一些流式代码,以便将最喜欢的冰淇淋口味即时分组到它们的类型中?

实际上如果我可以避免的话,我不想使用冰淇淋风味类型枚举列(它还不存在并且可能不应该添加,因为它更聪明冰淇淋口味映射到他们自己表中的类型)。理想情况下,我可以只检查最喜欢的冰淇淋口味字符串的后缀,然后根据字符串中的最后一个单词将其分解。

有没有办法以流的方式很好地进行这种分组?

【问题讨论】:

【参考方案1】:

你可以使用这样的 case 语句:

whens=
    'Dark chocolate': 'CHOCOLATE', 
    'Mint chocolate': 'CHOCOLATE',
    'Mango strawberry': 'BAD_TASTE'


from sqlalchemy import case

session.query(Person, case(whens=whens, value=Person.favorite_ice_cream_flavor).label('flavor_type')).all()

https://docs.sqlalchemy.org/en/14/core/sqlelement.html#sqlalchemy.sql.expression.case

【讨论】:

如果我不知道所有可能以“巧克力”结尾的口味怎么办?有没有办法让我动态地做到这一点? 使用value=func.regexp_replace(Person.favorite_ice_cream_flavor, '^.* ', '') 将大小写应用于最后一个单词,即。 whens='chocolate': 'CHOCOLATE'。我不知道你为什么需要这个,也许是为了避免 ENUM 只是尝试在 python 中操作属性。

以上是关于我可以将行/模型映射到由 SQLAlchemy 中的枚举列(或字符串列上的逻辑)键入的字典吗?的主要内容,如果未能解决你的问题,请参考以下文章

石墨烯突变未映射 SQLAlchemy 中的模型

SQLAlchemy中的模型名称

SQLAlchemy

如何使用点图元将纹理映射到由参数方程渲染的球体

如何在 SQLAlchemy 中使用动态关系映射层次结构?

无法将行转换为模型