Graphene/GraphQL 查找特定列值

Posted

技术标签:

【中文标题】Graphene/GraphQL 查找特定列值【英文标题】:Graphene/GraphQL find specific column value 【发布时间】:2019-11-17 03:01:12 【问题描述】:

由于某种原因,我无法弄清楚如何在我的 SQLAlchemy 数据库中简单地查找特定数据。

在graphene-python documentation 中,它只是简单地执行此查询以匹配 id(它是一个字符串):

book(id: "Qm9vazow") 
    id
    title

现在这是我的 BookSchema 的 Flask-Graphene-SQLAlchemy 代码,我想找到一个特定的标题而不是 ID:

class BookModel(db.Model):
    __table__ = db.Model.metadata.tables['books_book']

# Schema Object
class BookSchema(SQLAlchemyObjectType):
    class Meta:
        model = BookModel
        interfaces = (relay.Node, )

# Connection
class BookConnection(relay.Connection):
    class Meta:
        node = BookSchema

# GraphQL query
class Query(graphene.ObjectType):
    node = relay.Node.Field()
    allBooks = SQLAlchemyConnectionField(BookConnection)


schema = graphene.Schema(query=Query, types=[BookSchema])

当我运行这个查询时,一切正常并返回 3 个书名:


    "query": " allBooks(first: 3)  edges  node  title    "

但是,一旦我尝试匹配特定标题,它就会停止工作。例如:

# I tried all these queries, none worked
1.  allBooks(title: \"some book title\")  edges  node  title    
2.  allBooks(title: \"some book title\")  title 
3.  allBooks(title: 'some book title')  edges  node  title    

错误:"Unknown argument \"title\" on field \"allBooks\" of type \"Query\"."

我一定是犯了一个我没有看到的小错误,但我想不通。我花了几个小时试图弄清楚这一点。

问题:如何匹配标题并让它返回对象?我做错了什么?

【问题讨论】:

【参考方案1】:

想通了!请参阅下面的更改。

class Query(graphene.ObjectType):
    node = relay.Node.Field()
    all_books = SQLAlchemyConnectionField(BookConnection)

    # Added this
    find_book = graphene.Field(BookSchema, title = graphene.String())

    def resolve_find_book(self, info, title):
      query = BookSchema.get_query(info)
      return query.filter(BookModel.title == title).first()

我的 GraphQL 查询如下所示:


    "query": " findBook(title: \"some book title\")  title  "

希望这对未来的人有所帮助!

【讨论】:

似乎这也应该可以通过提供filter_fields 参数来实现,如docs 所示 看起来这个解决方案适用于基于 Django 的应用程序。我正在为我使用 Flask

以上是关于Graphene/GraphQL 查找特定列值的主要内容,如果未能解决你的问题,请参考以下文章

在EXCEL中 如何用VBA查找某特定单元格并返回该单元格的行和列值?

如何在radgrid中查找所选行的列值

Ext JS:如何在具有多个列值的网格中查找记录

如何使用“查找”来搜索在特定日期创建的文件? [关闭]

弹性搜索查询在regexp输入参数的列表中查找值的精确匹配

使用弹性搜索查询查找多个精确值