Wie definiere ich Python Enum-Eigenschaften, wenn MySQL ENUM-Werte in ihren Namen Leerzeichen enthalten?

10

Ich habe Python- EnumKlasse wie folgt:

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

In der MYSQL-Datenbank hat die ENUM-Spalte "Dienstalter" die Werte "Intern", "Junior Engineer", "Medior Engineer", "Senior Engineer".

Das Problem ist, dass ich eine Fehlermeldung bekomme:

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

Dieser Fehler ist aufgetreten, wenn ich eine Abfrage wie folgt aufrufe:

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

seniorityist enum Eigenschaft im UserPropertyModell.

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

Für diese Klasse habe ich die Schema-Klasse mit marshmallow Schemaund EnumFieldaus dem marshmallow_enumPaket definiert:

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

Was ist in dieser Situation zu tun, da ich den Eigenschaftsnamen der Python-Klasse nicht mit Leerzeichen definieren kann? Wie kann man Python zwingen, Werte definierter Eigenschaften anstelle von Eigenschaftsnamen zu verwenden?

Matija Lukic
quelle
2
Sehen Sie, ob dies notinventedhere.org/articles/python/…
Shenanigator

Antworten:

3

Wie Shenanigator im Kommentar meiner Frage feststellte, können wir Aliase verwenden, um dieses Problem zu lösen.

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

Eine Liste besteht aus vielen emblematischen Namen (Individuen), die an eine einzigartige, beständige Eigenschaft gebunden sind. Innerhalb einer Spezifikation können die Individuen nach Zeichen betrachtet werden, und die Zählung selbst kann wiederholt werden.

Modulinhalt

Dieses Modul charakterisiert vier Spezifikationsklassen, mit denen bemerkenswerte Anordnungen von Namen und Qualitäten charakterisiert werden können: Enum, IntEnum, Flag und IntFlag. Es kennzeichnet ebenfalls einen Dekorateur, einen Unikat () und einen Adjutanten, auto.

Klasse enum.Enum

Basisklasse zum Erstellen aufgelisteter Konstanten. Eine weitere Entwicklungsgrammatik finden Sie im Abschnitt Funktionale API.

Klasse enum.IntEnum

Basisklasse zum Erstellen aufgelisteter Konstanten, die zusätzlich Unterklassen von int sind.

Klasse enum.IntFlag

Basisklasse zum Erstellen aufgelisteter Konstanten, die mithilfe der bitweisen Administratoren konsolidiert werden können, ohne dass ihre IntFlag-Teilnahme verloren geht. IntFlag-Individuen sind zusätzlich Unterklassen von int.

Klasse enum.Flag

Basisklasse zum Erstellen aufgelisteter Konstanten, die mithilfe der bitweisen Aufgaben konsolidiert werden können, ohne dass die Flag-Registrierung verloren geht.

enum.unique ()

Enum Klasse Dekorateur, der nur einen Namen garantiert, ist an jeden Wert gebunden.

Klasse enum.auto

Beispiele werden durch einen geeigneten Anreiz für Enum-Personen ersetzt. Anfang wert Anfänge bei 1.

Neu in Variante 3.6: Flag, IntFlag, a

Chakri b
quelle