Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能使用;“类”;作为Python/SQLAlchemy中的枚举值?_Python_Enums_Sqlalchemy - Fatal编程技术网

我怎样才能使用;“类”;作为Python/SQLAlchemy中的枚举值?

我怎样才能使用;“类”;作为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) 这很有效,除了强

我在SQLAlchemy中有一个模型,其中一列是枚举。为了尽可能接近香草SQLAlchemy和Python3 stdlib,我已经针对stdlib的
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)