在 graphql 解析器中从 mySQL 查询现有的链接表?

Posted

技术标签:

【中文标题】在 graphql 解析器中从 mySQL 查询现有的链接表?【英文标题】:Querying existing linked tables from mySQL in a graphql resolver? 【发布时间】:2017-08-22 17:35:52 【问题描述】:

目前,我正在使用 Sequelize 连接到数据库并创建表,然后使用 Graphql 完成其余的工作,制作架构、查询和解析器。

我似乎遇到了如何从这 3 个链接表中获取数据的方法:

CITY CompLocations CompIssue | id | | locationID | compID | | locationID | issueLevel | |*1* | -----> | 1 | 45 | ------> | 45 | *5* | 2 | | 2 | 203 | | 203 | 3

我只需要通过这个现有的关系/关联检索与 CITY.id 关联的所有 CompIssue.issueLevel。

我正在查看 Sequelize 的 API 中的关联和查询。如何在 Grapql/Apollo 解析器函数中查询上述内容?

【问题讨论】:

【参考方案1】:

我知道这是一个较老的问题,但我最近遇到了类似的问题。在我的情况下,我使用 seriate 从 Nodejs 连接到 MSSQL 服务器,并希望根据 DB 设计动态创建 GraphQL 模式(按照链接字段等创建子查询)。走这条路我得到了sql:

`SELECT 
   BASE_TABLE = t.TABLE_NAME, 
   BASE_COLUMN = col.COLUMN_NAME, 
   DATA_TYPE, 
   LEN_PRECISION = COALESCE(
                             CHARACTER_MAXIMUM_LENGTH, 
                             numeric_precision, 
                             datetime_precision
                   ), 
   LINKED_TABLE = keys.Data_Table, 
   LINKED_COLUMN = keys.Data_Column 
FROM INFORMATION_SCHEMA.TABLES t INNER JOIN 
   INFORMATION_SCHEMA.COLUMNS col ON 
      t.TABLE_NAME = col.TABLE_NAME LEFT JOIN 
   ( SELECT 
            Base_Table = FK.TABLE_NAME, 
            Base_Column = CU.COLUMN_NAME, 
            Data_Table = PK.TABLE_NAME, 
            Data_Column = PT.COLUMN_NAME, 
            Constraint_Name = C.CONSTRAINT_NAME 
     FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C INNER JOIN 
            INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON 
               C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME INNER JOIN 
            INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON 
               C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME INNER JOIN 
            INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON 
               C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME INNER JOIN 
            ( SELECT 
                     i1.TABLE_NAME, 
                     i2.COLUMN_NAME 
              FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 INNER JOIN 
                     INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON 
                         i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
              WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
             ) PT ON 
             PT.TABLE_NAME = PK.TABLE_NAME 
   ) keys ON 
      keys.Base_Table = t.TABLE_NAME AND 
      keys.Base_Column = col.COLUMN_NAME 
WHERE t.TABLE_TYPE = 'BASE TABLE'`

这可能不是最优雅的,并且可能会在较大的数据库上遇到一些性能问题,但它对我来说效果很好。最终数据集将为您提供表/列对的列表,其中包含指向数据库设计中其他表/列对的任何链接。

从这个数据集中,检查链接并在 GraphQL 设置中创建您需要的任何子查询应该是“微不足道的”。

【讨论】:

以上是关于在 graphql 解析器中从 mySQL 查询现有的链接表?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 可以选择性地解析解析器中给定查询结果的字段吗?

在 GraphQL 解析器中链接集合

如何在nestjs graphql中实现用户保护

从 Rest(Express) 迁移到 GraphQL:模型(mongoose) 在 graphQL 解析器中不起作用

返回 node-mysql 中 graphql 解析器函数的 mysql 查询

在单个解析器中一次创建两种类型的数据 (Graphql + Prisma)