【问题标题】:The difference between Mutation and Query变异和查询的区别
【发布时间】:2018-06-08 18:47:00
【问题描述】:

我正在阅读GraphQL Docs 关于QueryMutation。然而,缺乏真实的例子来显示差异,最重要的是——什么时候适合使用它们。

非常感谢您的解释。

【问题讨论】:

    标签: graphql


    【解决方案1】:

    我想分享我自己的经验,也许它会为上面的好答案增加价值。

    Graphql 操作主要是查询数据库。关于这一点,Query 可以使用简单的 select 语句获取数据,该语句不会在 db 级别修改任何内容。但也可以运行一个存储过程 (spr) 左右并获得相同的数据。

    当我使用spr 时,我还在db 端创建了一些日志记录。例如,有时需要记录 spr 参数。或者在 db 表中记录谁发出了请求。

    如果我需要将数据请求(日志记录等)所做的修改显示给客户端,唯一的方法是使用 Mutation,这样我以后可以选择日志记录并将它们显示给客户端应用程序.

    如果我使用查询,数据可能不完整(日志记录可能在创建之前被查询等)

    【讨论】:

      【解决方案2】:

      引用自:https://graphql.org/learn/queries/#multiple-fields-in-mutations

      一个突变可以包含多个字段,就像一个查询一样。有一个 查询和突变之间的重要区别,除了 名称:

      虽然查询字段是并行执行的,但变异字段在 系列,一个接一个。

      这意味着,如果您并行运行 2 个突变,则只有在第一个突变完成后才会执行第二个突变。

      【讨论】:

        【解决方案3】:

        查询:

        它应该只用于数据库上的READ操作。

        突变:

        仅当您在数据库中执行 CREATE / UPDATE / DELETE 某些操作时才应使用它。

        总结

        如果您只想读取数据而不修改(意味着不删除、编辑或创建)数据库中的任何内容,请使用查询。如果您打算在数据库级别删除、创建任何内容,请使用突变。

        这就是文档所说的here

        在 REST 中,任何请求最终都可能对 服务器,但按照惯例,建议不要使用 GET 请求修改数据。 GraphQL 是相似的——技术上任何查询 可以实现导致数据写入。但是,它很有用 建立一个约定,任何导致写入的操作都应该是 通过突变显式发送。

        就像在查询中一样,如果突变字段返回一个对象类型, 您可以要求嵌套字段。这对于获取新的 更新后对象的状态。

        除了名称之外,查询和突变之间还有一个重要区别:

        虽然查询字段是并行执行的,但变异字段在 系列,一个接一个。这意味着如果我们发送两个 一个请求中的 incrementCredits 突变,第一个保证 在第二个开始之前完成,确保我们不会以 与我们自己竞争。

        【讨论】:

          【解决方案4】:

          按照惯例:

          • Query — 用于查询数据(SELECT 操作)
          • Mutation — 用于创建新数据和更新/删除现有数据(INSERTUPDATEDELETE

          详细

          从技术上讲,任何 GraphQL 查询都可以实现来导致数据写入。但是有一个约定,任何导致写入的操作都应该通过突变显式发送。

          除了语义上的差异之外,还有一个重要的技术差异

          Query 字段可以由 GraphQL 引擎并行执行,而 Mutation 顶级字段必须按照规范串行执行

          如果操作是突变,则操作的结果是在突变根对象类型上执行突变的顶级选择集的结果。此选择集应连续执行

          预计突变操作中的顶级字段会对底层数据系统产生副作用。提供的突变的串行执行可确保在这些副作用期间不受竞争条件的影响。

          来源:https://graphql.github.io/graphql-spec/draft/#sec-Mutation

          【讨论】:

            【解决方案5】:

            REST 中思考:

            查询 => GET, mutation => POST, PUT, 补丁删除

            【讨论】:

            • 这是一个非常肤浅的答案。在这里,我们都应该 downvote 这样的答案(对不起,作者)。如果您想发布答案 - 发布经过彻底调查的内容,例如 accepted answer
            • 其实这个答案只是对接受者的评论或小修改
            【解决方案6】:

            查询 = 选择

            变异 = 插入、更新、删除

            【讨论】:

            • 这是一个非常肤浅的答案。在这里,我们都应该 downvote 这样的答案(对不起,作者)。如果您想发布答案 - 发布经过彻底调查的内容,例如 accepted answer
            • 其实这个答案只是对接受者的评论或小修改
            【解决方案7】:

            简单来说,查询是SELECT语句,变异是INSERT操作。

            graphql 中的查询用于获取数据,而变异用于 INSERT/UPDATE/DELETE 操作。

            【讨论】:

            • 此时,是不是每次都要手动提交事务,还是 GraphQL 自动处理?
            • “登录”操作属于哪一类?
            • 这取决于你想放在哪里。但就我而言,我总是将登录名放在查询中。因为它不更新任何东西。请结帐here 了解更多信息。很抱歉迟到的回复没有收到通知。
            • 这是一个非常肤浅的答案。在这里,我们都应该 downvote 这样的答案(对不起,作者)。如果您想发布答案 - 发布经过彻底调查的内容,例如 accepted answer
            • @maxkoryukov 是的,这是简短的答案,但如果您看到接受的答案比这晚一年。这是该问题的第一个答案。
            猜你喜欢
            • 2023-03-24
            • 1970-01-01
            • 2013-06-20
            • 2019-11-21
            • 2014-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多