GraphQL中Select *的正确语法及相关语法变更等问题咨询
GraphQL 类SQL Select * 语法问题解答
1. Select * 的正确语法是什么?
GraphQL原生没有SQL里SELECT *的语法,但对接数据库的GraphQL实现(比如Hasura、PostGraphile这类)会支持类SQL查询,此时select *的写法分两种场景:
- 不使用表别名时:
select * from "categories" where label = $1
- 使用表别名时(用
T作为categories的别名):
select T.* from "categories" T where T."label" = $1
2. 如何编写全选查询?开启自省(introspection)时是否支持Select *?
- 原生GraphQL全选:必须明确列出目标类型的所有字段,比如针对
Category类型的全选查询示例:
query GetCategories($label: String!) { categories(where: {label: $label}) { id label description # 手动列出该类型的所有其他字段 } }
如果是兼容SQL的GraphQL服务,直接用select *就等价于全选对应表的所有字段。
- 自省功能:自省是用来查询Schema结构的工具,它本身不支持
select *语法,但可以通过自省查询获取某个类型的所有字段,再基于这些字段构建全选查询。比如用以下自省查询拿到Category的所有字段名:
query GetCategoryFields { __type(name: "Category") { fields { name } } }
3. 部分版本要求使用T.前缀,语法是否发生变更?
T.是SQL标准里的表别名引用语法,并非GraphQL本身的语法变更。要求使用前缀通常是因为:
- 查询涉及多表关联时,用别名前缀区分不同表的字段,避免字段名冲突
- 部分GraphQL数据库服务的版本更新后,为了语法严谨性,强制要求对设置了别名的表,必须用别名前缀引用其字段
你给出的第二个示例就是规范的表别名用法,用T指代categories表,T.*表示选中该表所有字段,T."label"明确指定字段所属的表,属于SQL的标准写法,不是语法变更。
内容的提问来源于stack exchange,提问作者DevKev
相关产品推荐
相关产品推荐

