Comment définir les propriétés Python Enum si les valeurs MySQL ENUM ont de l'espace dans leurs noms?


10

J'ai une Enumclasse Python comme celle-ci:

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

Dans la base de données MYSQL, la colonne d'ancienneté ENUM a les valeurs "Intern", "Junior Engineer", "Medior Engineer", "Senior Engineer".

Le problème est que j'obtiens une erreur:

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

Cette erreur s'est produite lorsque j'appelle une requête comme:

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

seniorityest une propriété enum dans le UserPropertymodèle.

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

Pour cette classe, j'ai défini la classe Schema en utilisant marshmallow Schemaet à EnumFieldpartir du marshmallow_enumpackage:

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

Que faire dans cette situation, car je ne peux pas définir de nom de propriété de classe python avec de l'espace. Comment forcer python à utiliser des valeurs de propriétés définies au lieu de noms de propriétés?


Réponses:


3

Comme Shenanigator l'a déclaré dans le commentaire de ma question, nous pouvons utiliser des alias pour résoudre ce problème.

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

Une liste est un grand nombre de noms emblématiques (individus) liés à des qualités uniques et stables. Dans une spécification, les individus peuvent être examinés par caractère, et le nombre lui-même peut être itéré.

Contenu du module

Ce module caractérise quatre classes de spécifications qui peuvent être utilisées pour caractériser des arrangements remarquables de noms et de qualités: Enum, IntEnum, Flag et IntFlag. Il caractérise également un décorateur, unique en son genre () et un assistant, auto.

class enum.Enum

Classe de base pour créer des constantes répertoriées. Voir segment API fonctionnelle pour une autre grammaire de développement.

classe enum.IntEnum

Classe de base pour créer des constantes répertoriées qui sont en outre des sous-classes de int.

classe enum.IntFlag

Classe de base pour créer des constantes répertoriées qui peuvent être consolidées en utilisant les administrateurs au niveau du bit sans perdre leur participation IntFlag. Les individus IntFlag sont en outre des sous-classes d'int.

class enum.Flag

Classe de base pour créer des constantes répertoriées qui peuvent être consolidées en utilisant les tâches au niveau du bit sans perdre leur inscription d'indicateur.

enum.unique ()

Décorateur de classe Enum qui garantit qu'un seul nom est lié à une valeur.

classe enum.auto

Les exemples sont remplacés par une incitation appropriée pour les individus Enum. Commencer vaut des débuts à 1.

Nouveau dans la variante 3.6: Flag, IntFlag, a

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.