Uso parámetros dinámicos para mis declaraciones SQLITE en node. Por ejemplo SELECT * FROM table WHERE table.id = ? . Todo esto funciona bastante bien. Pero con una consulta WHERE IN siempre no obtengo resultados. Lo que indica que está malinterpretando el parámetro dinámico. Aquí está mi código:
getModelsByBrandId: (ids_array) => {
const ids = ids_array.toString();
const sql = "SELECT * FROM models WHERE brand_id IN (?)";
const params = [ids];
return new Promise((resolve, reject) => {
db.all(sql, params, async (err, rows) => {
if (err) {
reject(err);
} else {
resolve(rows)
}
});
});
},
Ya había intentado pasar la matriz pero también una cadena ( array.toString() ). Desafortunadamente, ninguno de estos arrojó ningún resultado.
Pregunta: ¿Qué estoy haciendo mal y qué debo hacer para que la consulta WHERE IN funcione?
¡Gracias por adelantado! máx.
getModelsByBrandId: (ids_array) => {
const placeholders = ids_array.map(() => '?').join(',');
const params = ids_array;
const sql = "SELECT * "
+ "FROM models "
+ "WHERE brand_id IN (" + placeholders + ")";
return new Promise((resolve, reject) => {
db.all(sql, params, async (err, rows) => {
if (err) {
reject(err);
} else {
resolve(rows)
}
});
});
},
Debería enviar una consulta como
getModelsByBrandId([1, 2, 3]);
// sql = "SELECT * FROM models WHERE brand_id IN (?,?,?)"
// params = [1, 2, 3]
Necesitaba algo de la misma característica, donde estaba tratando con consultas sin procesar. Entonces, en lugar de escribir todo, y como ejercicio personal, escribí una función de plantilla que manejaba parámetros de SQL como estos.
import { sql } from "./sql.template";
const brand_ids = [1, 2, 3];
const [ query, params ] = sql`
SELECT *
FROM models
WHERE brand_id IN (${brand_ids})
`;
console.log({ query, params });
// { query:"SELECT * FROM models WHERE brand_id IN (?,?,?)", params:[1, 2, 3] }
Fuente disponible aquí .
Es escribir la declaración sin "parámetro dinámico" como:
const sql = "SELECT * FROM models WHERE brand_id IN (" + ids_array.toString() + ")";
const params = [];
¿Por qué? Vea los comentarios a continuación...