在Python中构造GraphQL查询字符串的最佳方法

anauzrmj  于 2023-01-01  发布在  Python
关注(0)|答案(3)|浏览(168)

我正在尝试这样做(见标题),但这有点复杂,因为我试图构建的字符串必须具有以下属性:

  • 多线
  • 包含大括号
  • 我想给它注入变量

使用一个普通的''''''多行字符串会使注入变量变得困难。使用多个f字符串会使注入变量变得容易,但是每个花括号(有很多花括号)都必须加倍。而且每一行都必须前置一个f。另一方面,如果我尝试使用format,它也会被所有的花括号弄糊涂。
有没有更好的办法我还没考虑过?

4sup72z8

4sup72z81#

可以使用“"”多行字符串方法。对于注入变量,请确保在定义字符串时使用$符号,并在www.example.com方法的JSON参数中使用variables对象requests.post。
下面是一个示例。ContactInput是我在GraphQL模式中定义的类型之一。

query = """
  mutation ($input:[ContactInput!]!) {
    AddContacts(contacts: $input) {
      user_id
    }
  }
"""
variables = {'input': my_arrofcontacts}
r = requests.post(url, json={'query': query , 'variables': variables})
e37o9pze

e37o9pze2#

可以使用以下软件包graphql-query
例如,对于查询

{
  leftComparison: hero(episode: EMPIRE) {
    ...comparisonFields
  }
  rightComparison: hero(episode: JEDI) {
    ...comparisonFields
  }
}

fragment comparisonFields on Character {
  name
  appearsIn
  friends {
    name
  }
}

我们有以下代码

from graphql_query import Argument, Operation, Query, Fragment, Field

comparisonFields = Fragment(
    name="comparisonFields",
    type="Character",
    fields=["name", "appearsIn", Field(name="friends", fields=["name"])]
)

leftComparison = Query(
    name="hero",
    alias="leftComparison",
    arguments=[Argument(name="episode", value="EMPIRE")],
    fields=[comparisonFields]
)

rightComparison = Query(
    name="hero",
    alias="rightComparison",
    arguments=[Argument(name="episode", value="JEDI")],
    fields=[comparisonFields]
)

operation = Operation(
    type="query",
    queries=[leftComparison, rightComparison],
    fragments=[comparisonFields]
)
print(operation.render())
# query {
#   leftComparison: hero(
#     episode: EMPIRE
#   ) {
#     ...comparisonFields
#   }
#
#   rightComparison: hero(
#     episode: JEDI
#   ) {
#     ...comparisonFields
#   }
# }
#
# fragment comparisonFields on Character {
#   name
#   appearsIn
#   friends {
#     name
#   }
# }
w8biq8rn

w8biq8rn3#

    • 不需要构造graphQL字符串来注入变量**。

这甚至是滥用graphQL因为它被设计用来分离查询定义和变量(参数)。

    • 只需学习如何使用query variables传递参数**。这在docs和许多教程中进行了描述。您应该了解并在实践中使用此技术。尝试使用字符串注入至少可以证明您缺乏知识。

如果你不是在写一个graphql编辑器或者其他工具,那么你根本就不应该使用字符串操作。顺便说一句,即使编辑器也不应该对字符串进行操作,而应该对AST进行操作。

    • 很少需要在graphql中操作字符串**,例如,让用户选择所需的答案(查询的响应部分)元素/片段。

更新

使用对象操作更具弹性/可用性-例如,轻松解决条件问题:How to conditionally include an argument in a GraphQL query?

相关问题