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



我有一个表,看起来像:

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 }}

(Olive被排除在外是因为它们已经死了,可能是因为吃香草冰淇淋的无聊(

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

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编写一些流媒体代码,将最喜欢的冰淇淋口味分组为它们的类型?

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

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

您可以使用这样的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

最新更新