【问题标题】:Sequelize query SELECT * FROM Table only returning one rowSequelize 查询 SELECT * FROM Table 只返回一行
【发布时间】: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


【解决方案1】:

我想你需要指出一个查询类型并像这样删除plain: true 选项:

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;`,
      { 
        type: Sequelize.QueryTypes.SELECT
      }
    );

来自 Sequelize 文档:

options.plain - Sets the query type to SELECT and return a single row

【讨论】:

  • 添加了它,这里仍然没有运气。
  • 伙计,你不会相信我一直在寻找这个答案。非常感谢,你是最棒的。
猜你喜欢
  • 1970-01-01
  • 2018-05-10
  • 2019-06-26
  • 2022-12-07
  • 2015-05-15
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多