Как определить свойства Python Enum, если в именах MySQL ENUM есть пробел? - PullRequest
10 голосов
/ 22 января 2020

У меня есть Python Enum класс, подобный этому:

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

В MYSQL базе данных столбец старшинства ENUM имеет значения "Стажер", "Младший инженер", "Средний инженер", " Старший инженер ".

Проблема в том, что я получаю ошибку:

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

Эта ошибка произошла, когда я вызываю запрос как:

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

seniority является свойством enum в модели UserProperty.

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

Для этого класса я определил класс схемы, используя marshmallow Schema и EnumField из пакета marshmallow_enum:

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

Что делать в этой ситуации, потому что я не могу определить python имя свойства класса с пробелом. Как заставить python использовать значения определенных свойств вместо имен свойств?

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Как сказал Шенанигатор в комментарии к моему вопросу, мы можем использовать псевдонимы для решения этой проблемы.

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 голосов
/ 30 января 2020

Список - это множество символических c имен (отдельных лиц), связанных с одним из устойчивых качеств. Внутри спецификации на отдельных персонажей можно смотреть, а сам счет можно повторять.

Содержимое модуля

Этот модуль характеризует четыре класса спецификации, которые можно использовать для характеристики замечательных комбинаций имен и качеств: Enum, IntEnum, Flag и IntFlag. Он также характеризует один декоратор, единственный в своем роде () и один помощник, auto.

class enum.Enum

Базовый класс для создания перечисленных констант. Смотрите сегмент Functional API для другой грамматики разработки.

class enum.IntEnum

Базовый класс для создания перечисленных констант, которые дополнительно являются подклассами int.

class enum.IntFlag

Базовый класс для создания перечисленных констант, которые могут быть объединены с использованием побитовых администраторов без потери их участия в IntFlag. IntFlag особи дополнительно являются подклассами int.

class enum.Flag

Базовый класс для создания перечисленных констант, которые можно консолидировать, используя побитовые задачи, не теряя при этом свою регистрацию Flag.

enum.unique ()

Декоратор класса Enum, который гарантирует, что одно имя привязано к любой ценности.

class enum.auto

Примеры заменены подходящим стимулом для людей Enum. Начальная стоимость начинается с 1.

Новое в варианте 3.6: Flag, IntFlag, a

...