Estoy usando el método Sequelize query() de la siguiente manera:
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); Debido a que estoy seleccionando dos columnas con nombres idénticos ( colname ), en el resultado obtengo algo como:
[{ "colname": "val1" }, { "colname": "val2" }...] , y esta matriz contiene valores solo de la columna table2.colname , ya que está sobrescribiendo los valores de table1.colname .
Sé que hay una opción para usar alias en la consulta SQL con AS , pero no tengo control sobre esta consulta.
Creo que resolvería el problema si hubiera una forma de devolver el resultado como una matriz 2D, en lugar de la matriz de objetos. ¿Hay alguna forma de configurar la consulta Sequelize de esa manera?
Me temo que esto no será posible sin cambios en la biblioteca que se conecten directamente a la base de datos y analicen su respuesta.
La razón es:
Este mapeo se vería así
// 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;Como puede ver, a menos que cambie el mecanismo interno en las bibliotecas, es imposible cambiar este comportamiento (objeto javascript).
A MENOS QUE esté usando mysql... Si está usando mysql, puede usar este https://github.com/mysqljs/mysql#joins-with-overlapping-column-names pero hay un problema... Sequelize no lo es admite esta opción, y debido a eso, se vería obligado a mantener el uso de ambas bibliotecas en una (y ambas conectadas)
Debido a que usa la consulta SQL directa (no compilada por secuencia, sino escrita a mano), necesita alias de las columnas correctamente.
Entonces, como viste, el nombre de la colname se sobrescribiría con el otro.
SELECT table1.colname, table2.colname FROM table1 JOIN table2 ON/*...*/Pero si usas un alias, entonces esa colisión no ocurrirá.
SELECT table1.colname as colName1, table2.colname as colName2 FROM table1 JOIN table2 ON/*...*/ y terminará con filas como: {colName1: ..., colName2: ...}
Si usa la creación de secuencias en el generador de consultas con modelos, la secuencia crearía un alias de todo y luego devolvería todo con los nombres que deseaba.
PD: Aquí hay un enlace para algunos conceptos básicos sobre alias en sql, ya que puede aliasar más que solo nombres de columnas https://www.w3schools.com/sql/sql_alias.asp