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
我正在使用 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