¿Cómo definir las propiedades de Python Enum si los valores de MySQL ENUM tienen espacio en sus nombres?


10

Tengo una Enumclase de Python como esta:

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

En la base de datos MYSQL, la columna ENUM de antigüedad tiene valores "Intern", "Junior Engineer", "Medior Engineer", "Senior Engineer".

El problema es que me sale un error:

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

Este error ha ocurrido cuando llamo consulta como:

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

seniorityes propiedad enum en el UserPropertymodelo.

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

Para esta clase, he definido la clase de esquema usando marshmallow Schemay EnumFielddesde el marshmallow_enumpaquete:

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

Qué hacer en esta situación, porque no puedo definir el nombre de propiedad de la clase python con espacio. ¿Cómo forzar a Python a usar valores de propiedades definidas en lugar de nombres de propiedades?


Respuestas:


3

Como Shenanigator declaró en el comentario de mi pregunta, podemos usar alias para resolver este 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')
    ]
)

2

Una lista es una gran cantidad de nombres emblemáticos (individuos) vinculados a cualidades únicas y constantes. Dentro de una especificación, los individuos pueden ser vistos por carácter, y el recuento en sí puede ser iterado.

Contenido del módulo

Este módulo caracteriza cuatro clases de especificación que se pueden utilizar para caracterizar arreglos notables de nombres y cualidades: Enum, IntEnum, Flag e IntFlag. También caracteriza a un decorador, uno de un tipo () y un asistente, auto.

clase enum.

Clase base para hacer constantes enumeradas. Ver segmento API funcional para otra gramática de desarrollo.

clase enum.IntEnum

Clase base para hacer constantes enumeradas que además son subclases de int.

clase enum.IntFlag

Clase base para hacer constantes enumeradas que se pueden consolidar utilizando los administradores bit a bit sin perder su participación en IntFlag. Los individuos IntFlag también son subclases de int.

clase enum.

Clase base para hacer constantes enumeradas que se pueden consolidar utilizando las tareas bit a bit sin perder su inscripción de Flag.

enum.unique ()

El decorador de clase Enum que garantiza un solo nombre está vinculado a cualquier valor.

clase enum.auto

Los ejemplos se suplantan con un incentivo adecuado para las personas Enum. Comienzo digno de comienzos en 1.

Nuevo en la variante 3.6: Flag, IntFlag, a

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.