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