Jak zdefiniować właściwości Python Enum, jeśli wartości MySQL ENUM mają spację w swoich nazwach?

10

Mam Enumtaką klasę Python :

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

W bazie danych MYSQL kolumna ENUM starszeństwa ma wartości „Intern”, „Junior Engineer”, „Medior Engineer”, „Senior Engineer”.

Problem polega na tym, że pojawia się błąd:

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

Ten błąd wystąpił, gdy wywołuję zapytanie takie jak:

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

seniorityjest właściwością wyliczania w UserPropertymodelu.

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

Dla tej klasy Mam klasy zdefiniowane przy użyciu schematu marshmallow Schemai EnumFieldod marshmallow_enumpakietu:

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

Co zrobić w tej sytuacji, ponieważ nie mogę zdefiniować nazwy właściwości klasy python za pomocą spacji. Jak zmusić pytona do używania wartości zdefiniowanych właściwości zamiast nazw właściwości?

Matija Lukic
źródło
2
sprawdź, czy to nie pomoże ininventedhere.org/articles/python/…
Shenanigator

Odpowiedzi:

3

Jak stwierdził Shenanigator w komentarzu do mojego pytania, możemy użyć aliasów, aby rozwiązać ten problem.

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')
    ]
)
Matija Lukic
źródło
2

Lista zawiera wiele emblematycznych nazw (osób) powiązanych z jedynymi w swoim rodzaju, stałymi cechami. Wewnątrz specyfikacji osoby można przeglądać według postaci, a samą liczbę można powtarzać.

Zawartość modułu

Ten moduł charakteryzuje cztery klasy specyfikacji, które można wykorzystać do scharakteryzowania niezwykłych układów nazw i cech: Enum, IntEnum, Flag i IntFlag. Podobnie charakteryzuje jednego dekoratora, jedyny w swoim rodzaju () i jednego pomocnika, auto.

klasa enum.Enum

Klasa podstawowa do tworzenia stałych na liście. Zobacz segment Functional API, aby uzyskać inną gramatykę programistyczną.

klasa enum.IntEnum

Klasa podstawowa do tworzenia stałych na liście, które są dodatkowo podklasami int.

klasa enum.IntFlag

Klasa podstawowa do tworzenia stałych na liście, które mogą być konsolidowane przy użyciu administratorów bitowych bez utraty udziału IntFlag. Osoby IntFlag są dodatkowo podklasami int.

klasa enum.Flag

Klasa podstawowa do tworzenia stałych na liście, które mogą być konsolidowane przy użyciu bitowych zadań bez utraty rejestracji flag.

enum.unique ()

Dekorator klasy Enum, który gwarantuje, że tylko jedno imię jest powiązane z jedną wartością.

klasa enum.auto

Przykłady zostały wyparte z odpowiednią zachętą dla osób Enum. Warto zacząć od 1.

Nowość w wariancie 3.6: Flag, IntFlag, a

czakri b
źródło