在 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 可以选择性地解析解析器中给定查询结果的字段吗?
从 Rest(Express) 迁移到 GraphQL:模型(mongoose) 在 graphQL 解析器中不起作用