1. 安装
需要使用 mysql 包
命令行运行npm i mysql
或 yarn add mysql
2. 建立与数据库的连接
const mysql = require('mysql')
const connection = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: 'root',
// 端口, mysql 端口一般是3306
port: 3306,
// 数据库的名称
database: 'database',
})
connection.connect(function(err) {
if (err) {
console.error('error connecting: ' + err)
return
}
console.log('connected as id ' + connection.threadId)
})
这样就开启与 mysql 的连接
3. mysql 的增删改查
1. 查
在已经建立连接的情况下
-
简单的例子
connection.query('SELECT * FROM database.datatable', function (error, results, fields) {
if (error) throw error
console.log(results)
})
上面的代码表示: 从 database 数据库中的datatable表中找到所有的数据, * 代表所有的项目
results 是一个数组, 包含父合查询条件的所有结果(和他们的状态)
-
第二个参数
第二个参数可以是一个数组
如果是一个数组, 那么这个数组的第n项会替换sql语句里的第n个问号
connection.query('SELECT * FROM database.datatable WHERE id = ? AND name = ?', [1, 'user'], function (error, results, fields) {
if (error) throw error
console.log(results)
})
-
limit
有的时候符合条件的结果很多, 但是只想要符合条件的第一个结果 ,
或者已经明确知道本次查询只会有一个符合条件的结果, 不想重复查找浪费性能
可以使用limit
connection.query('SELECT * FROM database.datatable limit(1, 1)', function (error, results, fields) {
if (error) throw error
console.log(results)
})
这里的limit表示, 从第1行开始, 查找出 1 个结果
2. 增
使用 INSET ... SET
会将对象拆分成 a = 1 AND b = 2 的形式
const post = {a: 1, b: 2}
connection.query('INSERT INTO base.table SET ?', post, (err, results) => {
if (err) {
console.log('err', err)
} else {
//
}
})
3. 改
const post = {a: 1, b: 2}
connection.query('UPDATE database.t_userdata SET ? WHERE id = ?', [post, id], (err, results) => {
if (err) {
console.log('err', err)
} else {
//
}
})
UPDATE 语句一定要加 WHERE 否则会删除整个数据表(删库跑路)
4. 删
为了避免有人看到这篇博客之后出了意外删库, 这里不写 删 的方法
不过, 一般的做法是使用UPDATE做一个假删除
const post = {isshow: 0, b: 2}
connection.query('UPDATE database.t_userdata SET ? WHERE id = ?', [post, id], (err, results) => {
if (err) {
console.log('err', err)
} else {
//
}
})
例如想删除某件商品, 是需要把它的 isshow 改成 0 就可以了
4. mysql 的连接池
使用连接池, 就会在每次进行数据库操作的时候,拿到一个连接, 使用完之后去释放连接, 避免长时间连接导致数据库卡斯等意外
// 使用 createPool 建立连接池
const pool = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: '1111',
port: '3306',
database: '11111',
})
// 每次进行数据库操作都要重新做 **获取连接池, 拿到数据, 释放连接** 这些操作
// 其他的跟普通的connection是一样的
pool.getConnection((err, connection) => {
if (err) {
throw err
}
connection.query('INSERT INTO database.xxx SET ?', post, (err, results) => {
connection.release()
if (err) {
console.log('err', err)
} else {
}
})
})
5. 回调地狱太多了
因为这些结果都是在回调函数中获得的, 而且有时需要反复获取/释放连接池, 当规模稍微大一些之后, 就不可避免会遇到回调地狱的问题
这里使用 Promise封装一下
代码如下:
// db.js 下
const mysql = require('mysql')
const pool = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: 'root',
port: '3306',
database: 'your database',
})
const sqlQuery = (sql, values) => {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) {
reject(err)
} else {
if (values) {
connection.query(sql, values, (err, rows) => {
if (err) {
reject(err)
} else {
resolve(rows)
}
connection.release()
})
} else {
connection.query(sql, (err, rows) => {
if (err) {
reject(err)
} else {
resolve(rows)
}
connection.release()
})
}
}
})
})
}
module.exports = { sqlQuery }
使用方法示例
sqlQuery('SELECT * FROM t_userdata WHERE unionId = ? limit 1', values).then(results => {
console.log('results', results)
})
或者使用 async + await ,会更方便一些
async function findData1() {
const results = await sqlQuery('SELECT * FROM t_user limit 1')
console.log(results)
}
async function findData2(id, name, orderNumber) {
const result1 = await sqlQuery('SELECT * FROM t_user WHERE id = ? limit 1', id)
const result2 = await sqlQuery('SELECT * FROM t_product WHERE name = ? limit 1', name)
const result3 = await sqlQuery('SELECT * FROM t_order WHERE order_number = ? limit 1', orderNumber)
}
可以看到, 再需要同步执行多次 sql 语句时, 使用async + await 会更方便
网友评论