Apollo GraphQL 突变结果不使用 PostgreSQL 更新,但适用于 SQLite

Posted

技术标签:

【中文标题】Apollo GraphQL 突变结果不使用 PostgreSQL 更新,但适用于 SQLite【英文标题】:Apollo GraphQL mutation results not updating with PostgreSQL but works with SQLite 【发布时间】:2019-09-23 03:49:37 【问题描述】:

为什么我使用 SQLite 从我的更新解析器获取更新的数据,而不是 postgress?如果这很重要,我也会将 Sequelize 用于 ORM。

关于 Apollo 和数据库的一般问题。基本上我有一个更新用户解析器,它更新用户的一些字段并返回用户。使用 SQLite 时,返回的数据是正确的更新用户。但是,当我切换到 postgres 时,数据总是落后 1 次更新?因此,当我最初在使用 postgres 时更新用户时,没有任何变化,但下次我更新它时,我会从上一次更新中获取数据,依此类推。我只是很困惑,因为我没有更改任何代码,只是更改了它使用的数据库。 Apollo 对不同数据库的行为是否不同,或者 postgress 与 sqlite 的行为是否不同?

// model

"use strict";
module.exports = (sequelize, DataTypes) => 
  const User = sequelize.define(
    "User",
    
      id: 
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      ,
      firstName: DataTypes.STRING,
      lastName: DataTypes.STRING,
      userType: DataTypes.STRING,
    ,
  );

  User.associate = function(models) 
  ;
// typeDef

  type User 
    id: ID!
    firstName: String
    lastName: String
    userType: String
    createdAt: String
    updatedAt: String
  
// resolver

    async updateUser(
      root,
      
        id,
        firstName,
        lastName,
        userType,
      ,
       models 
    ) 
      models.User.update(
        
          firstName: firstName,
          lastName: lastName,
          userType: userType,
        ,
        
          where:  id: id 
        
      );
      return models.User.findByPk(id);
    ,
//query

mutation 
  updateEmployee(
    id: 1
    firstName: "testName"
    lastName: "testUpdate"
    employeeID: "12345"
  )
    id
    firstName
    lastName
    employeeID
    createdAt
    updatedAt
  

【问题讨论】:

【参考方案1】:

您没有等待update 调用,因此findByPkupdate 调用有机会完成之前返回用户。

await models.User.update(  // <-- here
  
    firstName: firstName,
    lastName: lastName,
    userType: userType,
  ,
  
    where:  id: id 
  
);
return models.User.findByPk(id);

FWIW,如果您使用 Postgres,则可以通过提供 returning 选项来使用单个调用:

const [_, user] = await models.User.update(
  
    firstName: firstName,
    lastName: lastName,
    userType: userType,
  ,
  
    where:  id: id ,
    returning: true,
  
);
return user;

【讨论】:

以上是关于Apollo GraphQL 突变结果不使用 PostgreSQL 更新,但适用于 SQLite的主要内容,如果未能解决你的问题,请参考以下文章

返回突变结果的正确方法? (GraphQL 与 Apollo 和 Mongoose

Apollo / GraphQl - 单实体突变不更新缓存(数据库更新)

React Native、GraphQL、Apollo - 如何创建批量插入突变

既不是突变也不是查询的 Apollo/GraphQL 动作

使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是啥

为嵌套模式 graphql/apollo/react 添加突变