2017-02-20 23 views
2

私は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に強制する方法がありますか?

+0

この値を使用すると、SQLAlchemyや他のライブラリコードのエラーが発生しますか? 'TaxonRank ['class']'はあなたに合ったものを使うことができます。 –

+0

'TaxonRank [" class "]'は問題ありません。問題は定義にあり、具体的には 'class_ =" class "'です。これは、データベースに格納される属性値( 'class')ではなく、属性名(' class_')です。 – snoopy91

+0

この[使用形態](https://docs.python.org/3.4/library/enum.html#functional-api)を使用してください。 'TaxonClass'を' Enum( 'TaxonClass'、['domain'、 'kingdom'、 'phylum'、 'class']) 'として定義すると' class_'属性名を避けることができます。 –

答えて

1

私には、enum.Enumを定義するための代替フォームを指摘してくれたSergey Shubinのおかげです。

TaxonRank = enum.Enum("TaxonRank", [ 
    ("domain", "domain"), 
    ("kingdom", "kingdom"), 
    ("phylum", "phylum"), 
    ("class", "class"), 
    ("order", "order"), 
    ("family", "family"), 
    ("genus", "genus"), 
    ("species", "species") 
]) 
関連する問題