Neste artigo falarei sobre o pacote squel, um gerador de SQL para Node.js. Utilizar um gerador é bastante produtivo, pois evita que tenhamos que escrever e debugar as queries diretamente. Abordarei apenas algumas consultas básicas, mas o pacote é bastante versátil.
Atenção: Embora o pacote também possa ser utilizado pelo browser, você não deve executar em seu servidor consultas geradas pelo cliente, uma vez que isso trás sérios problemas de segurança.
Instalação e Configuração
Para instalá-lo, e adicioná-lo automaticamente às dependências de seu package.json
, digite
1 |
npm install --save squel |
O pacote não precisa de nenhuma configuração para ser utilizado.
Utilização Básica
Retirei alguns exemplos da documentação oficial.
Insert
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// INSERT INTO test (f1) VALUES (1) squel.insert() .into("test") .set("f1", 1) .toString() // INSERT INTO test (name, age) VALUES ('Thomas', 29), ('Jane', 31) squel.insert() .into("test") .setFieldsRows([ { name: "Thomas", age: 29 }, { name: "Jane", age: 31 } ]) .toString() |
Select
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// SELECT * FROM table squel.select() .from("table") .toString() // SELECT t1.id, t2.name FROM table `t1` LEFT JOIN table2 `t2` ON (t1.id = t2.id) WHERE (t2.name <> 'Mark') AND (t2.name <> 'John') GROUP BY t1.id squel.select() .from("table", "t1") .field("t1.id", "id") .field("t2.name") .left_join("table2", "t2", "t1.id = t2.id") .group("t1.id") .where("t2.name <> 'Mark'") .where("t2.name <> 'John'") .toString() |
Update
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// UPDATE test, test2, test3 AS `a` SET test.id = 1, test2.val = 1.2, a.name = "Ram", a.email = NULL, a.count = a.count + 1 squel.update() .table("test") .set("test.id", 1) .table("test2") .set("test2.val", 1.2) .table("test3","a") .setFields({ "a.name": "Ram", "a.email": null, "a.count = a.count + 1": }) .toString() |
Delete
1 2 3 4 5 6 |
// DELETE FROM table1 WHERE (table1.id = 2) ORDER BY id DESC LIMIT 2 squel.delete() .from("table1") .where("table1.id = ?", 2) .order("id", false) .limit(2) |
Utilizando Prepared Statements
Sempre que possivel, é recomendável a utilizaçao de prepared statements. Escrevi um artigo que mostra como utilizar prepared statements com o pacote node-mysql2
, escrevendo as consultas SQL manualmente.
Para fazê-lo utilizando o pacote squel
é bastante simples:
1 |
<span class="hljs-comment">// text : SELECT FROM table1 WHERE (table1.id = ?) AND (table1.name = ?);</span> |
1 2 3 4 5 6 7 8 9 10 |
// values : [2, "john doe"] var query = squel .select() .from("table1") .where("table1.id = ?", 2) .where("table1.name = ?", "john doe") .toParam(); //assumindo que conn é uma conexão gerada pelo pacote node-mysql2 conn.query(query.text, query.values, callback); |
Ainda há muito mais. É possível utilizar subconsultas, condições bastante complexas e a geração de queries com comandos específicos para mysql
e postgres
. Vale a pena conferir a documentação completa!