【问题标题】:Sequelize raw query is returning duplicate dataSequelize 原始查询返回重复数据
【发布时间】:2021-11-12 23:23:54
【问题描述】:

所以,我有一个查询返回一些用户的报告,代码是:

const reports = await database.query(
  'SELECT r.id, r.type, r.fileCid, r.madeById, r.reportedId, u1.username as reportedName, u2.username as madeBy \
  FROM reports r \
  left join users u1 on u1.id = r.reportedId \
  inner join users u2 on u2.id = r.madeById '
);

return reports;

如果我直接在我的数据库上运行它,它会返回这个示例数据:

+----+------+------------------------------------------------+----------+------------+--------------+--------+
| id | type | fileCid | madeById | reportedId | reportedName | madeBy |
+----+------+------------------------------------------------+----------+------------+--------------+--------+
|  5 |    1 | cidF    |        4 |       NULL | NULL         | username    |
|  6 |    0 | cidF    |        4 |       NULL | NULL         | username    |
+----+------+------------------------------------------------+----------+------------+--------------+--------+

所以我作为对象的预期结果是:

[{
        "id": 5,
        "type": 1,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }, {
        "id": 6,
        "type": 0,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }]

但它确实返回了一个重复数据的数组:

[
    [{
        "id": 5,
        "type": 1,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }, {
        "id": 6,
        "type": 0,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }],
    [{
        "id": 5,
        "type": 1,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }, {
        "id": 6,
        "type": 0,
        "fileCid": "cidF",
        "madeById": 4,
        "reportedId": null,
        "reportedName": null,
        "madeBy": "ftk"
    }]
]

为什么会这样?这显然是 sequelize 的一个问题,因为如果我直接在 MySql 上运行它,只会按预期返回 2 个寄存器......另外,不是重复的问题from this one,尽管它可能看起来

编辑 这就是报告表格的定义方式。我只是在猜测,因为我对同一个表使用了两个外键,所以可能 sequelize 会产生这个错误:

const Report = database.define('report', {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    allowNull: false,
    primaryKey: true
  },
  type: {
      type: Sequelize.INTEGER,
      allowNull: false
  }
},
{
  updatedAt: false
}
)

Report.belongsTo(User, {as: 'madeBy'});
Report.belongsTo(User, {as: 'reported'});
Report.belongsTo(File);

【问题讨论】:

  • 您确定上面粘贴的代码与正在运行的代码相同吗?尝试更改查询中的某些内容,例如从 SELECT 列表中删除一列。
  • 是的,它是相同的代码。我在开发中使用nodemon。我也做了你推荐的测试,错误仍然存​​在。
  • 如果在.query 函数中添加{ type: QueryTypes.SELECT } 作为第二个参数会怎样?

标签: javascript node.js sequelize.js


【解决方案1】:

query 函数可以接受选项作为第二个参数,这个type 选项将确定响应的格式。

// The type of query you are executing. The query type affects how results are formatted before they are passed back.
type: QueryTypes.SELECT

原始查询的更多选项:https://sequelize.org/master/manual/raw-queries.html

您的查询是 SELECT,因此添加 SELECT 类型会将响应格式化为常规 Sequelize findAll

const reports = await database.query(
    'SELECT r.id, r.type, r.fileCid, r.madeById, r.reportedId, u1.username as reportedName, u2.username as madeBy \
    FROM reports r \
    left join users u1 on u1.id = r.reportedId \
    inner join users u2 on u2.id = r.madeById ',
{ type: QueryTypes.SELECT }
);

另外,您也可以将此原始查询更改为 findAll,这更适合 Sequelize 方式。

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2018-05-30
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多