Como definir propriedades do Python Enum se os valores do MySQL ENUM têm espaço em seus nomes?

10

Eu tenho Enumclasse Python como esta:

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

No banco de dados MYSQL, a coluna ENUM de antiguidade possui os valores "Estagiário", "Engenheiro júnior", "Engenheiro médio", "Engenheiro sênior".

O problema é que eu recebo um erro:

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

Este erro ocorreu quando eu chamo uma consulta como:

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

seniorityé uma propriedade enum no UserPropertymodelo.

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

Para esta classe, defini a classe Schema usando marshmallow Schemae EnumFielddo marshmallow_enumpacote:

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

O que fazer nessa situação, porque não consigo definir o nome da propriedade da classe python com espaço. Como forçar o python a usar valores de propriedades definidas em vez de nomes de propriedades?

Matija Lukic
fonte
2
veja se isso ajuda notinventedhere.org/articles/python/…
Shenanigator

Respostas:

3

Como Shenanigator afirmou no comentário da minha pergunta, podemos usar aliases para resolver esse problema.

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
fonte
2

Uma lista contém muitos nomes emblemáticos (indivíduos) vinculados a qualidades únicas e constantes. Dentro de uma especificação, os indivíduos podem ser vistos por caractere e a própria contagem pode ser repetida.

Conteúdo do módulo

Este módulo caracteriza quatro classes de especificação que podem ser utilizadas para caracterizar arranjos notáveis ​​de nomes e qualidades: Enum, IntEnum, Flag e IntFlag. Da mesma forma, caracteriza um decorador, um de um tipo () e um auxiliar, automático.

classe enum.Enum

Classe base para criar constantes listadas. Consulte a API Funcional do segmento para obter outra gramática de desenvolvimento.

classe enum.IntEnum

Classe base para criar constantes listadas que são subclasses adicionais de int.

classe enum.IntFlag

Classe base para criar constantes listadas que podem ser consolidadas utilizando os administradores bit a bit sem perder sua participação no IntFlag. Os indivíduos IntFlag também são subclasses de int.

classe enum.Flag

Classe base para criar constantes listadas que podem ser consolidadas utilizando as tarefas bit a bit sem perder a inscrição no Flag.

enum.unique ()

O decorador de classe Enum, que garante apenas um nome, está vinculado a qualquer valor.

classe enum.auto

Exemplos são suplantados com um incentivo adequado para indivíduos Enum. Início no valor de 1.

Novo na variante 3.6: Flag, IntFlag, um

chakri b
fonte