我有一个数据库表,其中包含在整个代码中“静态”访问的特定公司,如果有一种“静态”方式来引用它们,那就太好了,例如:
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 值?
最简单的解决方案是使用函数获取名称和 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
) 库的作者。