Sequelize 原始查询返回重复数据
Sequelize raw query is returning duplicate data
所以,我得到一个查询,returns 一些用户的报告,代码是:
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;
如果我直接 运行 它在我的数据库中,它 returns 这个示例数据:
+----+------+------------------------------------------------+----------+------------+--------------+--------+
| 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 上 returns 只有 2 个寄存器,正如预期的那样......另外,不是重复的问题 ,虽然它似乎
编辑
这就是报告的 table 的定义方式。我只是猜测,因为我对同一个 table 使用了两个外键,也许 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);
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 的方式。
所以,我得到一个查询,returns 一些用户的报告,代码是:
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;
如果我直接 运行 它在我的数据库中,它 returns 这个示例数据:
+----+------+------------------------------------------------+----------+------------+--------------+--------+
| 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 上 returns 只有 2 个寄存器,正如预期的那样......另外,不是重复的问题
编辑 这就是报告的 table 的定义方式。我只是猜测,因为我对同一个 table 使用了两个外键,也许 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);
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 的方式。