私はSQLAlchemyの中で、列が列挙型のモデルを持っています。バニラSQLAlchemyのと可能な限りのpython3のSTDLIBに近い滞在したい、私はSTDLIBのenum.Enum
クラスに対して列挙型を定義し、その後、SQLAlchemyのにそのsqlalchemy.Enum
クラスを使用していることを与えてきました(どこかSQLAlchemyのドキュメントで推奨されているように。)Python/SQLAlchemyでenum値として "class"を使用するにはどうすればよいですか?
rank = sqlalchemy.Column(sqlalchemy.Enum(TaxonRank), name = "rank", nullable = False)
これはPythonのキーワードとの競合を避けるために、自然に列挙値(のいずれかのclass_
の代わりclass
を使用するように私を強制する以外、うまく機能:
とモデルに
class TaxonRank(enum.Enum):
domain = "domain"
kingdom = "kingdom"
phylum = "phylum"
class_ = "class"
order = "order"
family = "family"
genus = "genus"
species = "species"
にアクセスしようとしています)
私はclass_
を使用しても構いませんが、問題は、class_
がデータベースに格納された値になってしまうことです。これは、私のCRUD APIで問題を引き起こしています。ここでは、ユーザーが「ランクがランクの終わりでフィルタをかけるようにして、ss
で終了します。値は実際にはss_
で終わるので、当然これは何も一致しません!
私はレコード表示のために、class_
の代わりにユーザーclass
を常に表示するためにいくつかのハッキーケースバイケースの変換を行ってきました。しかし、ソートやフィルタリングに似たようなことをするのは、SQLレベルでこれらの両方を行うので、もっと難しいです。
私の質問:この軽度な悩みの周りに良い方法がありますか?私はPythonでTaxonRank.class_
にアクセスすることに本当に気をつけませんが、おそらく、stdlibのenum.Enum
をサブクラス化してclass_
属性の文字列表現(したがって実際にデータベースに格納される値)を所望のclass
に強制する方法がありますか?
この値を使用すると、SQLAlchemyや他のライブラリコードのエラーが発生しますか? 'TaxonRank ['class']'はあなたに合ったものを使うことができます。 –
'TaxonRank [" class "]'は問題ありません。問題は定義にあり、具体的には 'class_ =" class "'です。これは、データベースに格納される属性値( 'class')ではなく、属性名(' class_')です。 – snoopy91
この[使用形態](https://docs.python.org/3.4/library/enum.html#functional-api)を使用してください。 'TaxonClass'を' Enum( 'TaxonClass'、['domain'、 'kingdom'、 'phylum'、 'class']) 'として定義すると' class_'属性名を避けることができます。 –