Sequelize 如何将 return 结果作为二维数组而不是对象数组?

Sequelize how to return result as a 2D array instead of array of objects?

我正在使用 Sequelize query() 方法如下:

const sequelize = new Sequelize(...);
...
// IMPORTANT: No changed allowed on this query
const queryFromUser = "SELECT table1.colname, table2.colname FROM table1 JOIN table2 ON/*...*/";
const result = await sequelize.query(queryFromUser);

因为我选择了两个名称相同的列 (colname),所以我得到的结果如下:

[{ "colname": "val1" }, { "colname": "val2" }...],并且此数组仅包含来自列 table2.colname 的值,因为它正在覆盖 table1.colname 值。

我知道在 AS 的 SQL 查询中可以选择使用别名,但我 无法控制此查询.

我认为这会解决问题,如果有办法 return 将结果作为二维数组而不是对象数组?有什么方法可以这样配置 Sequelize 查询吗?

如果不更改直接连接到数据库并解析其响应的库,恐怕这是不可能的。

原因是:

  • 数据库returns 两个值
  • 然后在 javascript 中,有接收到的行值到对象的映射

这个映射看起来像那样

// RETURNED VALUE FROM DB:   row1 ->  fieldName:value&fieldName:value2
// and then javascript code for parsing values from database would look similar to that:

const row = {};
row.fieldName = value;
row.fieldName = value2;

return row;

如您所见 - 除非您更改库中的内部机制,否则无法更改此(javascript 对象)行为。

除非您正在使用 mysql...如果您正在使用 mysql,您可能会使用此 https://github.com/mysqljs/mysql#joins-with-overlapping-column-names 但有一个问题...Sequelize 不支持此选项,因此,您将被迫同时使用两个库(并且都已连接)

这一行后面是较旧的答案(之前,没有添加查询中的更改'')

因为您使用直接 sql 查询(不是由 sequelize 构建,而是手工编写),您需要正确地为列设置别名。

如您所见,colname 中的一个会被另一个覆盖。

SELECT table1.colname, table2.colname FROM table1 JOIN table2 ON/*...*/

但是如果你别名那么,那么冲突就不会发生

SELECT table1.colname as colName1, table2.colname as colName2 FROM table1 JOIN table2 ON/*...*/

你最终会得到如下行:{colName1: ..., colName2: ...}

如果您在带有模型的查询生成器中使用 sequelize build - sequelize 会为所有内容添加别名,然后 return 所有内容都使用您想要的名称。

PS:这里有一个 link 关于在 sql 中使用别名的一些基础知识,因为您可能使用的别名不仅仅是列名 https://www.w3schools.com/sql/sql_alias.asp