我在这里使用STRING_ARRAY测试一个查询:http://sqlfiddle.com/#!17/952405/1
也在这里:
SELECT to_char(workshop_date, 'YYYY-MM-DD') date, STRING_AGG(first_name || ' ' || last_name, ', ')
FROM parents_workshops
JOIN parents ON parents.id = ANY(parents_workshops.parents_id)
WHERE teacher_id = 1
GROUP BY date
以上内容按预期工作。但是,当我使用Knex在Node.JS / Express服务器上运行它时,我得到一个奇怪的响应。
代码如下:
// teachers.js
const findParentWorkshops = id =>
knex.raw(
`SELECT to_char(workshop_date, 'YYYY-MM-DD') date, STRING_AGG(first_name || ' ' || last_name, ', ')FROM parents_workshops
JOIN parents ON parents.id = ANY (parents_workshops.parents_id)
WHERE teacher_id = ${id} GROUP BY date`
);
// TeacherController.js
const getParentWorkshops = (req, res, next) => {
const teacherId = req.params.id;
Teacher.findParentWorkshops(teacherId)
.then(workshops => {
res.status(200).json({
ok: true,
status: 200,
message: `Parents' workshops found`,
length: workshops.length,
workshops,
});
})
.catch(next);
};
// teacherRoutes.js
router
.route(`/teachers/:id/parents-workshops`)
.get(getParentWorkshops)
.post(postParentWorkshop);
我期望与上面的sqlfiddle相同的输出。但是,我回来了(注意,期望的数据应该是'workshops'键的值:
{
"ok": true,
"status": 200,
"message": "Parents' workshops found",
"workshops": {
"command": "SELECT",
"rowCount": 0,
"oid": null,
"rows": [],
"fields": [
{
"name": "date",
"tableID": 0,
"columnID": 0,
"dataTypeID": 25,
"dataTypeSize": -1,
"dataTypeModifier": -1,
"format": "text"
},
{
"name": "string_agg",
"tableID": 0,
"columnID": 0,
"dataTypeID": 25,
"dataTypeSize": -1,
"dataTypeModifier": -1,
"format": "text"
}
],
"_parsers": [
null,
null
],
"RowCtor": null,
"rowAsArray": false
}
}
我进行了一些搜索,发现这是INSERT查询通常返回的node-postgres格式,但是我还没有找到解决方案。有什么想法吗?
答案 0 :(得分:0)
您的函数findParentWorkshops
似乎正在返回查询定义(的一部分),而不是查询结果。因此它实际上并没有执行。
下面,我将其显式包装在promise中,并包含return
语句,然后执行产生结果。我使用的是节点v6,也许您的最新版本运行的有所不同,或者您使用的是bluebird来实现承诺?
此外,请注意.on('query'
子句。我在调试时使用它。它可以确保生成的SQL符合我的期望,并表明查询实际上正在执行。
我保留.on('query-error'
子句以获取良好的运行时错误提示,但实际上是通过基于文件的机制进行记录的。
function findParentWorkshops(id) {
console.log('Debug 00 .findParentWorkshops');
return Promise.resolve()
.then( function() {
console.log('Debug 01');
return db.raw( `SELECT to_char(workshop_date, 'YYYY-MM-DD') date, STRING_AGG(first_name || ' ' || last_name, ', ')FROM parents_workshops
JOIN parents ON parents.id = ANY (parents_workshops.parents_id)
WHERE teacher_id = ? GROUP BY date` , [id])
// debug error reporting, remove for production.
.on('query', function(data) {
console.log('Debug81 query:', data);
})
// runtime error reporting, execution is not interrupted.
.on('query-error', function(ex, obj) {
console.log("Error89 .on.query-error", {"obj":obj, "ex":ex} );
})
})
};