MySQL ENUM値の名前にスペースがある場合、Python Enumプロパティを定義するにはどうすればよいですか?


10

私はEnumこのようなPython クラスを持っています:

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

MYSQLデータベースでは、年功序列のENUM列に「Intern」、「Junior Engineer」、「Medior Engineer」、「Senior Engineer」という値があります。

問題は、エラーが発生することです。

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

このエラーは、次のようなクエリを呼び出したときに発生しました。

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

seniorityUserPropertyモデルの列挙型プロパティです。

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

このクラスでは、パッケージを使用marshmallow Schemaしてスキーマクラスを定義しました。EnumFieldmarshmallow_enum

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

スペースでpythonクラスプロパティ名を定義できないので、この状況で何をすべきか。Pythonにプロパティ名の代わりに定義されたプロパティの値を使用させるにはどうすればよいですか?


回答:


3

Shenanigatorが私の質問のコメントで述べたように、エイリアスを使用してこの問題を解決できます。

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

リストは、一種の堅実な性質に結び付けられた多くの象徴的な名前(個人)です。仕様内では、個人を文字で見ることができ、カウント自体を繰り返すことができます。

モジュールの内容

このモジュールは、Enum、IntEnum、Flag、およびIntFlagの4つの仕様クラスを特徴付け、それらを使用して名前と品質の驚くべき配置を特徴付けることができます。同様に、1つのデコレータ(kind()の1つ)と1つの補佐(auto)を特徴付けます。

クラスenum.Enum

リストされた定数を作成するための基本クラス。他の開発文法については、セグメントの機能APIを参照してください。

クラスenum.IntEnum

さらにintのサブクラスであるリストされた定数を作成するための基本クラス。

クラスenum.IntFlag

IntFlagの参加を失うことなくビット単位の管理者を利用して統合できるリストされた定数を作成するための基本クラス。IntFlag個体は、さらにintのサブクラスです。

クラスenum.Flag

フラグの登録を失うことなくビット単位のタスクを利用して統合できるリストされた定数を作成するための基本クラス。

enum.unique()

名前が1つだけであることを保証する列挙型クラスデコレータは、任意の値にバインドされます。

クラスenum.auto

例は、列挙型の個人に適したインセンティブに取って代わられています。1から始まります。

バリアント3.6の新機能:Flag、IntFlag、a

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.