Graphene-SQLAlchemy 中的 'sqlalchemy.types.Enum' 字段映射到 GraphQL



考虑以下枚举类:

import enum
class CoverTitleColor(enum.Enum):
YELLOW = "yellow"
RED = "red"
BLUE = "blue"
ORANGE = "orange"
WHITE = "white"
PURPLE = "purple"

设置为SQLAlchemy ORM字段,如下所示:

class Book(Base, OrmBaseMixin):
__tablename__ = "books"
book_id = sqlalchemy.Column(
sqlalchemy.types.Integer(),
primary_key=True,
)
...
cover_title_color = sqlalchemy.Column(
sqlalchemy.types.Enum(CoverTitleColor),
nullable=False
)

并通过以下方式接触石墨烯:

class TypeBook(SQLAlchemyObjectType):
class Meta:
model = Book

但是,当通过以下查询通过 GraphQL 自省TypeBook时:

{
__type(name: "TypeBook") {
name
fields {
name
type {
name
kind
ofType {
name
kind
}
}
}
}
}

coverTitleColor字段被解释为字符串:

{
"name": "coverTitleColor",
"type": {
"name": null,
"kind": "NON_NULL",
"ofType": {
"name": "String",
"kind": "SCALAR"
}
}
},

查询该字段时,例如,通过:

query {
books(year: 1990) {
coverTitleColor
} 
}

结果确实是这样的字符串:

{
"data": {
"books": [
{
"coverTitleColor": "CoverTitleColor.YELLOW"
},
{
"coverTitleColor": "CoverTitleColor.RED"
}
]
}
}

我错过了什么吗?这是预期的行为吗?

完整的工作代码可以在 https://github.com/somada141/demo-graphql-sqlalchemy-falcon/tree/issue-graphene-sqlalchemy-135

此问题也已作为GH问题发布在 https://github.com/graphql-python/graphene-sqlalchemy/issues/135

不确定我是否为时已晚,但对我有用的是将 str 方法注入枚举类。所以你可以这样写CoverTitleColor

class CoverTitleColor(str, enum.Enum):

它适用于查询和突变。