postgresql - Hasura 中的一个计算域,它返回一个整数数组
问题描述
问题
我正在尝试添加返回整数数组的计算字段。Hasura 目前支持 anySETOF <table-name>
或BASE
type 的返回类型。我尝试返回一个integer[]
但它失败了(它不是一个BASE
类型)。有解决办法吗?
这是我尝试过的
我有两个表:课程和测验,一个课程有很多测验,每个测验都有一个名为难度的整数字段。我想在课程表中添加一个计算字段,其中列出了相关测验的不同难度。
使用 SQL,我们可以创建一个数组,用这个查询生成这个列表:
SELECT array(SELECT DISTINCT difficulty FROM quizzes
WHERE course_id = 1 ORDER BY difficulty ASC);
因此,我创建了一个返回此查询结果的函数,并将其作为计算字段添加到课程表中
CREATE OR REPLACE FUNCTION courses_quiz_difficulties(course_row courses)
RETURNS integer[] AS $$
SELECT array(SELECT DISTINCT difficulty FROM quizzes
WHERE course_id = course_row.id ORDER BY difficulty ASC);
$$
LANGUAGE SQL STABLE;
当我尝试添加计算域时,出现错误,因为 int 数组不是 BASE 类型。
在表“课程”中:在计算字段“quiz_difficulties”中:计算字段“quiz_difficulties”不能添加到表“课程”中,因为函数“courses_quiz_difficulties”返回类型 _int4 不是 BASE 类型
有没有办法让它与 Hasura 一起工作?
这是相应的文档:
https://hasura.io/docs/1.0/graphql/manual/schema/computed-fields.html#supported-sql-functions
解决方案
一个简单的视图给了我想要的结果:
CREATE VIEW course_quiz_difficulties AS
SELECT
course_id,
array_agg(DISTINCT difficulty ORDER BY difficulty) as quiz_difficulties
FROM quizzes GROUP BY course_id
之后我们可以手动添加课程和新视图之间的关系:
courses . id → course_quiz_difficulties . course_id
Hasura 允许我们从以下位置查询 quiz_difficulties courses
:
query MyCourseQuizDifficulties {
courses(limit: 1) {
id
quiz_difficulties {
quiz_difficulties
}
}
}
我们得到这个结果:
{
"data": {
"courses": [
{
"id": 1,
"quiz_difficulties": {
"quiz_difficulties": [
1,
2
]
}
}
]
}
}
推荐阅读
- java - 如何在Java中添加两个列表
- sql - 数据库查询sql
- vue.js - 通过 Nginx 代理服务时,Vue App Routing 不起作用
- reactjs - 如何创建中间件来检查每个页面上的 JWT 令牌(React + Redux)?
- ubuntu - 错误:在 Raspberry Pi 上安装 tensorflow 时,此平台不支持 .whl
- vba - Visio - 如何取消组合形状但保持相同的名称?
- amazon-s3 - 403 禁止访问被拒绝 s3 bucket putobject
- django - 作为我的 Django 应用程序的一部分的长时间运行的连接
- ios - 获取 JSON 数据时发现 nil
- scala - 为什么我无法在 scala REPL / Shell 中找到 spark.implicits._?