我怎样才能使用;“类”;作为Python/SQLAlchemy中的枚举值?
我在SQLAlchemy中有一个模型,其中一列是枚举。为了尽可能接近香草SQLAlchemy和Python3 stdlib,我已经针对stdlib的我怎样才能使用;“类”;作为Python/SQLAlchemy中的枚举值?,python,enums,sqlalchemy,Python,Enums,Sqlalchemy,我在SQLAlchemy中有一个模型,其中一列是枚举。为了尽可能接近香草SQLAlchemy和Python3 stdlib,我已经针对stdlib的enum.enum类定义了enum,然后使用其SQLAlchemy.enum类将其提供给SQLAlchemy(正如SQLAlchemy文档中的建议) 在模型中: rank = sqlalchemy.Column(sqlalchemy.Enum(TaxonRank), name = "rank", nullable = False) 这很有效,除了强
enum.enum
类定义了enum,然后使用其SQLAlchemy.enum
类将其提供给SQLAlchemy(正如SQLAlchemy文档中的建议)
在模型中:
rank = sqlalchemy.Column(sqlalchemy.Enum(TaxonRank), name = "rank", nullable = False)
这很有效,除了强制我对其中一个枚举值使用class
而不是class
(自然避免与Python关键字冲突;尝试访问TaxonRank.class
是非法的语法)
我并不介意使用class
,但我遇到的问题是class
是最终存储在数据库中的值。这反过来又导致我的CRUD API出现问题,我允许用户执行类似于“在秩上过滤,其中秩以ss
结尾”的操作。当然,这与任何内容都不匹配,因为值实际上以ss\ucode>结尾
对于记录显示,我已经加入了一些简陋的逐案翻译,以始终显示用户class
,而不是class
。然而,在排序和过滤方面做类似的事情更为棘手,因为我在SQL级别同时做这两件事
所以我的问题是:有没有一个好办法来解决这种轻微的烦恼?我并不真正关心在Python中访问TaxonRank.class
,但也许有一种方法可以对stdlib的enum.enum
进行子类化,以强制使用class
属性的字符串表示(以及实际存储在数据库中的值)到所需的类
?感谢您为我指出了定义enum.enum的替代形式
TaxonRank = enum.Enum("TaxonRank", [
("domain", "domain"),
("kingdom", "kingdom"),
("phylum", "phylum"),
("class", "class"),
("order", "order"),
("family", "family"),
("genus", "genus"),
("species", "species")
])
我一直在为俄语和英语数据库开发接口。我正在使用postgresql,但它可能适用于任何品牌X枚举。这就是解决方案:
在mymodel.py中:
from sqlalchemy.dialects.postgresql import ENUM
from .meta import Base
from enum import Enum
class NounVar(Enum):
abstract = 1
proper = 2
concrete = 3
collective = 4,
compound = 5
class Nouns(Base):
__tablename__ = 'nouns'
id = Column(Integer, primary_key=True)
name = Column(Text)
runame = Column(Text)
variety = Column("variety", ENUM(NounVar, name='variety_enum'))
然后在default.py中进一步:
from .models.mymodel import Nouns
class somecontainer():
def somecallable():
page = Nouns(
name="word",
runame="слово",
variety=NounVar().concrete))
self.request.dbsession.add(page)
我希望它对您有用。使用此值是否会导致SQLAlchemy或其他库代码出错?如果适合您,您可以使用TaxonRank['class']
。TaxonRank['class']
就可以了;问题出在定义中,具体来说,class=“class”
。放入数据库的是属性名(class_u
),而不是属性值(class
),请尝试使用此选项。如果您将TaxonClass
定义为Enum('TaxonClass',['domain','kingdom','phylum','class'])
您可以避免class.
属性名。谢谢!此表单起作用:Enum('TaxonClass',[(“class”,“class”)])
,以保留数据库中class
的值(与默认的自动递增整数相反)
from .models.mymodel import Nouns
class somecontainer():
def somecallable():
page = Nouns(
name="word",
runame="слово",
variety=NounVar().concrete))
self.request.dbsession.add(page)