Bagaimana cara mendefinisikan properti Python Enum jika nilai-nilai MySQL ENUM memiliki ruang dalam namanya?

10

Saya memiliki Enumkelas Python seperti ini:

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

Dalam database MYSQL, kolom ENUM senioritas memiliki nilai "Intern", "Junior Engineer", "Medior Engineer", "Senior Engineer".

Masalahnya adalah saya mendapatkan kesalahan:

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

Kesalahan ini terjadi ketika saya memanggil permintaan seperti:

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

seniorityadalah properti enum dalam UserPropertymodel.

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

Untuk kelas ini saya telah mendefinisikan kelas Skema menggunakan marshmallow Schemadan EnumFielddari marshmallow_enumpaket:

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

Apa yang harus dilakukan dalam situasi ini, karena saya tidak dapat mendefinisikan nama properti kelas python dengan spasi. Bagaimana cara memaksa python untuk menggunakan nilai properti yang ditentukan alih-alih nama properti?

Matija Lukic
sumber
2
lihat apakah ini membantu notinventedhere.org/articles/python/…
Shenanigator

Jawaban:

3

Seperti yang dinyatakan oleh Shenanigator dalam komentar pertanyaan saya, kita dapat menggunakan alias untuk menyelesaikan masalah ini.

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

Daftar adalah banyak nama simbol (individu) yang terikat pada salah satu dari jenis, kualitas stabil. Di dalam spesifikasi, individu dapat dilihat berdasarkan karakter, dan hitungan itu sendiri dapat diulangi.

Isi Modul

Modul ini mencirikan empat kelas spesifikasi yang dapat digunakan untuk mengkarakterisasi pengaturan nama dan kualitas yang luar biasa: Enum, IntEnum, Flag, dan IntFlag. Ini juga mencirikan satu dekorator, satu dari jenis (), dan satu pembantu, otomatis.

enum kelas

Kelas dasar untuk membuat konstanta yang terdaftar. Lihat segmen Fungsional API untuk tata bahasa pengembangan lainnya.

kelas enum.IntEnum

Kelas dasar untuk membuat konstanta terdaftar yang juga subkelas int.

kelas enum.IntFlag

Kelas dasar untuk membuat konstanta terdaftar yang dapat dikonsolidasikan menggunakan administrator bitwise tanpa kehilangan partisipasi IntFlag mereka. Individu IntFlag juga merupakan subkelas int.

kelas enum. Bendera

Kelas dasar untuk membuat konstanta terdaftar yang dapat dikonsolidasikan menggunakan tugas bitwise tanpa kehilangan pendaftaran Bendera mereka.

enum.unique ()

Penghias kelas Enum yang menjamin hanya satu nama terikat dengan nilai apa pun.

kelas enum.auto

Contoh digantikan dengan insentif yang sesuai untuk individu Enum. Awal yang layak dimulai pada 1.

Baru dalam varian 3.6: Bendera, IntFlag, a

chakri b
sumber