优质广告供应商

广告是为了更好地支持作者创作

nodejs 下 mysql 使用方法

1. 安装

需要使用 mysql 包
命令行运行npm i mysqlyarn 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 会更方便

优质广告供应商

广告是为了更好地支持作者创作

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 166,817评论 24 703
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    爱运动爱学习阅读 15,648评论 3 114
  • 优质广告供应商

    广告是为了更好地支持作者创作

  • 我杀了她,我平静地想。 今年是第七年。做得不算隐秘,甚至是草草了事,可是至今都没有人发现。 ...
    椰子冻啊喂阅读 194评论 0 0
  • 最近工作中遇到了一些瓶颈,所以开始思考自己从事了将近九年的工作。 建筑究竟是什么? 我记得大学,公共原理的老师在课...
    我叫张一一阅读 328评论 0 0
  • 或许是又到了6月毕业季,又或是2017年已经过去了三分之一,大家都变得迷茫并且急功近利,最近发现很多读者问同样的问...
    涅槃的轩爹阅读 1,136评论 4 8
  • 阿拉伯数字72大家都不会陌生,看到72想到的可能就是孙猴子的72变,除了72...
    姗姗_9862阅读 1,512评论 7 3
  • 优质广告供应商

    广告是为了更好地支持作者创作

  • 三法印: 诸行无常、诸行无我,涅槃寂静 四谛:“苦、集、灭、道” 苦、集二谛阐明人生的本质及形成原因;灭、道二谛指...
    06aa84f3901a阅读 274评论 0 0