将没有 ID 字段的表用于 GraphQL 服务器进行中继

Posted

技术标签:

【中文标题】将没有 ID 字段的表用于 GraphQL 服务器进行中继【英文标题】:Using tables without ID field for GraphQL server for Relay 【发布时间】:2019-10-19 21:00:22 【问题描述】:

我有一个旧版 SQL 数据库,其中包含未针对 Relay Modern 优化的表,因为这些表都没有属性

身份证

我使用 Sequelize 作为 ORM,express-graphql 作为 GraphQl 层。

序列化层:

const STAFF = sequelize.define('staff', 
    sid: 
        // set the primary key for the table
        primaryKey: true,
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
        unique: true
    ,
    firstName: 
        type: Sequelize.STRING,
        allowNull: false
    

GraphQl 层:

const StaffType = new GraphQLObjectType(
  name: 'Staff',
  description: 'This is the GraphQl schema for the staff table',
  fields: () => (
    sid:  type: GraphQLInt ,
    firstName:  type: GraphQLString 
  )
)

如您所见,此表有一个唯一键 sid

我想知道是否有办法为服务器上的不同唯一键创建别名,以便我可以在客户端使用 Relay Modern 并可以编写如下查询:


  node(id: "4") 
    id
    ... on Staff 
      firstName
    
  

这是 Relay 不得不说的字段:

Relay 对对象识别的支持依赖于 GraphQL 服务器以标准化的方式公开对象标识符。在查询中,模式应该提供一个标准的机制来通过 ID 请求一个对象。在响应中,架构提供了提供这些 ID 的标准方式。

https://facebook.github.io/relay/graphql/objectidentification.htm

【问题讨论】:

确定服务器的 GraphQL 架构的代码在哪里?在那里,您应该能够声明字段id,它在内部解析为sid 我添加了 Sequelize 层。 sid 是实际唯一的主键,不能改成id 【参考方案1】:

改用StaffType 试试这个:

const StaffType = new GraphQLObjectType(
  name: 'Staff',
  description: 'This is the GraphQl schema for the staff table',
  fields: () => (
    id: 
      type: GraphQLID,
      resolve: (parent, args, ctx) => parent.sid
    ,
    firstName:  type: GraphQLString 
  )
)

在这里,我们将来自传入 GraphQL 查询的字段 id 解析为我们的内部字段 sid。查看this tutorial,了解有关 GraphQL 解析器的更多信息。

【讨论】:

嗨 Nilan,是的,这可能有效,但这不是我发现的 Relay 做事方式。我可能找到了解决方案,但我仍然需要对其进行测试。 此代码用于后端,独立于 Relay。 Relay 可以看到的所有类型都是StaffType 类型,它需要一个字段id。所以,说“这不是 Relay 的做事方式”是令人惊讶的,我认为是错误的。是什么让你这么说? 顺便说一句,如果我正确阅读了the Relay spec,我们需要id 类型的ID 字段而不是Int,我相应地更改了我的答案。 目前我正在测试这个包graphql-sequelize。有一个解释如何使它成为Relay ready。 github.com/mickhansen/graphql-sequelize/blob/master/docs/…。对于 id 我可以使用这个函数id: globalIdField(Staff.sid)

以上是关于将没有 ID 字段的表用于 GraphQL 服务器进行中继的主要内容,如果未能解决你的问题,请参考以下文章

用于在突变字段上映射数组的 GraphQL 语法

Graphql查询只解析_id字段,其他字段为空

使用 Sequelize 在 GraphQL 查询中将日期时间字段输出为字符串

graphql:将字段添加到连接表

如何使用不同的字段生成相同的 graphql 查询

Apollo/GraphQL:用于时间戳的字段类型?