Depois que o ES6 introduziu Template String
no Javascript, ficou muito fácil fazer interpolação de valores. Porém quando falamos em construção de queries em formato de string, utilizar essa abordagem não é tão interessante quanto se parece.
Utilizar template string na construção de queries, pode abrir uma porta muito grande para SQL injection. Temos formas de evitar isso.
Utilizando o client BigQuery para NodeJS, vou mostrar pra vocês 2 caminhos para escrita de queries.
❌ Com template strings
// Params
const gender = "M";
const states = ["WA", "WI", "WV", "WY"]
.map((state) => `'${state}'`)
.join(", ");
// Query
const sqlQuery = `SELECT name, sum(number) as count
FROM \`<YOUR_TABLE_NAME>\`
WHERE gender = '${gender}'
AND state IN (${states});`;
// Run the query
const [rows] = await bigquery.query(sqlQuery);
console.log("Result -> ", rows);
✅ Com parameterized queries
Ref: https://cloud.google.com/bigquery/docs/parameterized-queries
const gender = "M";
const states = ["WA", "WI", "WV", "WY"];
// Query
const sqlQuery = `SELECT name, sum(number) as count
FROM \`<YOUR_TABLE_NAME>\`
WHERE gender = @gender'
AND state IN UNNEST(@states);`;
const options = {
query: sqlQuery,
params: { gender, states },
};
// Run the query
const [rows] = await bigquery.query(options);
console.log("Result -> ", rows);
Podemos setar tipos 😍
// ...
const options = {
query: sqlQuery,
params: { gender, states },
types: {
gender: 'STRING',
states: ['STRING'],
},
};
// ...
Com parameterized queries utilizamos o client da forma correta, assim como o BigQuery recomenda e evitamos SQL injection.
Espero ter te ajudado.
Top comments (0)