美文网首页
nodejs 下 mysql 使用方法

nodejs 下 mysql 使用方法

作者: 没头脑很不高兴 | 来源:发表于2018-08-30 11:48 被阅读0次

    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 会更方便

    相关文章

      网友评论

          本文标题:nodejs 下 mysql 使用方法

          本文链接:https://www.haomeiwen.com/subject/pfxqwftx.html