连接使用MySql
安装MySql模块:
npm install mysql
创建连接:
1 const mysql = require('mysql') 2 3 // 连接 mysql 服务器 4 const connection = mysql.createConnection({ 5 host: '127.0.0.1', 6 user: 'root',//数据库访问的用户名 7 password: '123456',//数据库访问的密码 8 port: '3306',//数据库端口号 9 database: 'XXX',//数据库名称 10 }) 11 // 执行SQL 12 connection.query(sql, function (err, result) { 13 err // 错误信息 14 result // 结果 15 }) 16 // 销毁连接 | 由于 JS 是异步的,所以当前代码会在执行 SQL 之前就销毁了连接 17 connection.destroy()
用 createConnection 创建 Mysql 连接,每执行一次 connection.query 都是一个全新的连接,会造成一个资源的极大浪费,降低性能。
连接池是另外的一种执行方法,它一次性的创建了多个连接,然后根据客户端的查询,自动的 分发、复用、管理 这些连接。
1 const mysql = require('mysql') 2 3 //创建连接池 4 const pool = mysql.createPool({ 5 host: '127.0.0.1', 6 user: 'root',//数据库访问的用户名 7 password: '123456',//数据库访问的密码 8 port: '3306',//数据库端口号 9 database: 'XXX',//数据库名称 10 }) 11 12 const db = { 13 sqlQuery(sql, values) { 14 return new Promise((resolve, reject) => { 15 pool.getConnection((err, connection) => { 16 if (err) { 17 reject(err) 18 } else { 19 if (values) { 20 connection.query(sql, values, (err, rows) => { 21 if (err) { 22 reject(err) 23 } else { 24 resolve(rows) 25 } 26 connection.release() 27 }); 28 } else { 29 connection.query(sql, (err, rows) => { 30 if (err) { 31 reject(err) 32 } else { 33 resolve(rows) 34 } 35 connection.release() 36 }); 37 } 38 } 39 }) 40 }) 41 } 42 }
MySql查询变量用一个 ?号 作为占位符(防止SQL注入):
1 var query = 'UPDATE users SET foo = ?, bar = ?, baz = ? WHERE id = ?', 2 value = ['a', 'b', 'c', userId]; 3 connection.query(query, value, (error, results, fields) => { /* ... */ });
第一个参数 query 是一个字符串,是查询的 sql 语句,含有占位符。
第二个参数 value 是一个数组,含有所有占位符的值。
标识符(数据库、表、列名)用两个 ?号 做占位符(即 ?? ),除此之外,可以将标识符的名字当成 query 变量一起传进值列表中:
1 var query = 'UPDATE ?? SET foo = ?, bar = ?, baz = ? WHERE id = ?', 2 value = ['users', 'a', 'b', 'c', userId]; 3 connection.query(query, value, (error, results, fields) => { /* ... */ });