【发布时间】:2020-07-05 05:49:35
【问题描述】:
我目前正在使用 PostgreSQL 和 Sequelize.js 来查询一些数据。当我使用 sequelize.query() 时,它只返回一行数据,但是当我通过 pgAdmin 输入它时,它按预期工作。
这是我在 sequelize.query() 中使用的代码。
SELECT table2.student_id,
s.canvasser_name,
l.level_name,
table2.total_score
FROM (SELECT table1.student_id,
sum(table1.max_score) total_score
FROM (SELECT sq.student_id,
max(sq.score) max_score
FROM public.student_quiz sq
GROUP BY sq.quiz_id, sq.student_id) table1
GROUP BY table1.student_id) table2
INNER JOIN public.student s
ON s.id = table2.student_id
INNER JOIN public.level l
ON l.id = s.level_id
ORDER BY table2.total_score DESC
LIMIT 10;
这是nodejs代码
const getRank = (option, logs = {}) => new Promise(async (resolve, reject) => {
try {
let { offset, limit } = option;
if (!limit) limit = 10;
const result = await sequelize.query(
`SELECT table2.student_id,
s.canvasser_name,
l.level_name,
table2.total_score
FROM (SELECT table1.student_id,
sum(table1.max_score) total_score
FROM (SELECT sq.student_id,
max(sq.score) max_score
FROM public.student_quiz sq
GROUP BY sq.quiz_id, sq.student_id) table1
GROUP BY table1.student_id) table2
INNER JOIN public.student s
ON s.id = table2.student_id
INNER JOIN public.level l
ON l.id = s.level_id
ORDER BY table2.total_score DESC
LIMIT 10;`,
{ plain: true }
);
return resolve(result);
} catch (error) {
let customErr = error;
if (!error.code) customErr = Helpers.customErrCode(error, null, undefinedError);
logger.error(logs);
return reject(customErr);
}
});
这是使用上述函数的代码
const getRankController = async (req, res) => {
try {
const { offset, limit } = req.query;
const result = await getRank({ offset, limit });
if (result.length < 1) {
return Helpers.response(res, {
success: false,
message: 'cannot get score list'
}, 404);
}
return Helpers.response(res, {
success: true,
result
});
} catch (error) {
return Helpers.error(res, error);
}
};
与此同时,我正在尝试另一种使用 sequelize 内置函数的方法,这是代码。
const getRank = (
option,
logs = {}
) => new Promise(async (resolve, reject) => {
try {
// eslint-disable-next-line prefer-const
let { offset, limit } = option;
if (!limit) limit = 10;
const result2 = await StudentQuiz.findAll({
attributes: ['studentId', [sequelize.fn('sum', sequelize.fn('max', sequelize.col('score'))), 'totalPrice'], 'quizId'],
group: 'studentId',
include: [
{
model: Student,
include: [{
model: Level
}],
},
],
offset,
limit
});
return resolve(result2);
} catch (error) {
let customErr = error;
if (!error.code) customErr = Helpers.customErrCode(error, null, undefinedError);
logger.error(logs);
return reject(customErr);
}
});
因为它是嵌套函数,所以这个不起作用,我有点不明白如何重现它。
我尝试做一些简单的查询,比如 SELECT * FROM table,它返回一行,然后我发现我需要在表名中添加“public”,所以它变成了 SELECT * FROM public.table它成功了。好吧,直到我尝试第二个代码块中的代码。
任何答案或建议将不胜感激,谢谢。
【问题讨论】:
-
似乎您的表位于
Public架构中,因此它可以在您选择具有架构名称的表的地方工作 -
@JimMacaulay 我明白了,所以知道为什么它只返回一行。我的意思是如果它没有返回,我就会得到它,但为什么它只返回一个?
-
可能问题出在sequelize代码中。将其添加到问题中是个好主意。
-
@BjarniRagnarsson 不错的电话,我已经更新了。请看一看。
-
您是否尝试在
return resolve(result);设置断点并查看result的内容是什么?
标签: javascript sql node.js postgresql sequelize.js