【问题标题】:Querying existing linked tables from mySQL in a graphql resolver?在 graphql 解析器中从 mySQL 查询现有的链接表?
【发布时间】: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 解析器函数中查询上述内容?

【问题讨论】:

    标签: javascript mysql sequelize.js graphql-js


    【解决方案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 设置中创建您需要的任何子查询应该是“微不足道的”。

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2021-02-02
      • 2011-03-28
      • 2019-10-14
      • 2020-02-15
      • 2020-11-19
      • 2018-11-23
      • 2020-01-04
      • 2019-04-06
      相关资源
      最近更新 更多