如何让Enum的int值与对应的数据库记录id匹配?

问题描述 投票:0回答:1

我有一个数据库表,其中包含在整个代码中“静态”访问的特定公司,如果有一种“静态”方式来引用它们,那就太好了,例如:

from enum import Enum, auto()

class CompanyEnum(Enum):
     APPLE = auto()
     AMAZON = auto()
     META = auto()
     

我希望 Enum 的 int 值与这些公司对应的数据库 ID 相匹配,但我当然不希望在静态 Enum 定义中使用硬编码

id
,因为这将是一个糟糕的解决方案。为什么这会是一个糟糕的解决方案?因为无法保证如果从备份重新创建或重新生成数据库,这些公司的人工 ID 将保持不变。

我可以做类似的事情(假设我正在使用 Peewee):

from functools import lru_cache
from enum import Enum, auto()
from models import Company

class CompanyEnum(Enum):
     APPLE = auto()
     AMAZON = auto()
     META = auto()

     @lru_cache
     @property
     def id(self):
         company = Company.get(Company.name.upper() == self.name)
         return company.id
        

如何使这个动态解析的

id
属性成为实际的 Enum int 值?

python enums peewee
1个回答
0
投票

最简单的解决方案是使用函数获取名称和 ID,然后使用函数 API 创建枚举。比如:

CompanyEnum = Enum('CompanyEnum', get_names_ids('company'))

get_names_ids(column)
类似于:

def get_names_ids(column):
    # talk to dbs and get values of id and column fields
    return ... # [(id_1, company_1), (id_2, company_2), ...]

get_names_ids
可能必须确保大写值等,但这是基础。


披露:我是 Python stdlib

Enum
enum34
backport
Advanced Enumeration (
aenum
)
库的作者。

© www.soinside.com 2019 - 2024. All rights reserved.