MySQL ENUM 값에 공백이있는 경우 Python Enum 속성을 정의하는 방법은 무엇입니까?


10

다음 Enum과 같은 Python 클래스 가 있습니다 .

from enum import Enum
class Seniority(Enum):
    Intern = "Intern"
    Junior_Engineer = "Junior Engineer"
    Medior_Engineer = "Medior Engineer"
    Senior_Engineer = "Senior Engineer"

MYSQL 데이터베이스에서 seniority ENUM 열의 값은 "Intern", "Junior Engineer", "Medior Engineer", "Senior Engineer"입니다.

문제는 오류가 발생한다는 것입니다.

LookupError: "Junior Engineer" is not among the defined enum values

이 오류는 다음과 같은 쿼리를 호출 할 때 발생했습니다.

UserProperty.query.filter_by(full_name='John Doe').first()

seniorityUserProperty모델의 열거 형 속성입니다 .

class UserProperty(db.Model):
   ...
   seniority = db.Column(db.Enum(Seniority), nullable=True)
   ...

이 클래스를 위해 나는 사용하여 스키마 클래스를 정의한 marshmallow SchemaEnumField에서 marshmallow_enum패키지 :

class UserPropertySchema(Schema):
    ...
    seniority = EnumField(Seniority, by_value=True)
    ...

공백으로 파이썬 클래스 속성 이름을 정의 할 수 없기 때문에이 상황에서해야 할 일. 파이썬이 속성 이름 대신 정의 된 속성 값을 사용하도록 강제하는 방법은 무엇입니까?


답변:


3

Shenanigator가 내 질문에 대한 의견에서 언급했듯이 별칭을 사용 하여이 문제를 해결할 수 있습니다.

Seniority = Enum(
    value='Seniority',
    names=[
        ('Intern', 'Intern'),

        ('Junior Engineer', 'Junior Engineer'),
        ('Junior_Engineer', 'Junior_Engineer'),

        ('Medior Engineer', 'Medior Engineer'),
        ('Medior_Engineer', 'Medior_Engineer'),

        ('Senior Engineer', 'Senior Engineer'),
        ('Senior_Engineer', 'Senior_Engineer')
    ]
)

2

목록은 친절하고 꾸준한 특성 중 하나에 묶인 상징적 인 이름 (개별)입니다. 사양 내에서 개인은 특성별로 볼 수 있으며 카운트 자체는 반복 될 수 있습니다.

모듈 내용

이 모듈은 Enum, IntEnum, Flag 및 IntFlag와 같이 이름과 특성의 현저한 배열을 특성화하는 데 사용할 수있는 네 가지 사양 클래스를 특징으로합니다. 마찬가지로 하나의 데코레이터, kind () 및 aide, auto를 특징으로합니다.

enum.Enum 클래스

나열된 상수를 만들기위한 기본 클래스입니다. 다른 개발 문법에 대해서는 기능 API 세그먼트를 참조하십시오.

enum.IntEnum 클래스

int의 추가 서브 클래스 인 나열된 상수를 만들기위한 기본 클래스입니다.

enum.IntFlag 클래스

IntFlag 참여를 잃지 않고 비트 단위 관리자를 사용하여 통합 할 수있는 나열된 상수를 만들기위한 기본 클래스입니다. IntFlag 개인은 추가적으로 int의 서브 클래스입니다.

클래스 enum.Flag

플래그 등록을 잃지 않고 비트 단위 작업을 사용하여 통합 할 수있는 나열된 상수를 만들기위한 기본 클래스입니다.

enum.unique ()

하나의 이름 만 보장하는 Enum 클래스 데코레이터는 어떤 가치에도 구속됩니다.

enum.auto 클래스

예는 Enum 개인에게 적합한 인센티브로 대체됩니다. 1부터 시작하는 가치가있는 시작.

변형 3.6의 새로운 기능 : Flag, IntFlag,

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.