Node.js - 在项目中操作 MySQL

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

在项目中操作数据库的步骤

  • 安装操作 MySQL 数据库的第三方模块(mysql)
  • 通过 mysql 模块连接到 MySQL 数据库
  • 通过 mysql 模块执行 SQL 语句

安装与配置 mysql 模块

  • 安装 mysql 模块

    mysql 模块是托管于 npm 上的第三方模块。它提供了在 node.js 项目中连接和操作 MySQL 数据库的能力

    npm install mysql
    复制代码
  • 配置 mysql 模块

    在使用 mysql 模块操作 MySQL 数据库之前,必须先对 mysql 模块进行必要的配置,具体步骤

    • 1.导入 mysql 模块

    • 2.建立与 MySQL 数据库的连接

    // 导入 mysql 模块
    const mysql = require('mysql')
    // 建立 MySQL 数据库的连接关系
    const db = mysql.createPool({
    
        // 数据库 IP 地址
        host:'127.0.0.1',
        // 登录数据库的账号
        user:'root',
        // 登录数据库的密码
        password:'admin123',
        // 指定要操作哪个数据库
        database:'my_db_01'
    })
    复制代码
  • 检测 mysql 模块能否正常工作

    调用 db.query() 函数,指定要执行的 SQL 语句,通过回调函数拿到执行结果

    // 测试 mysql 模块能否正常工作
    db.query('select 1', (err, results) => {
    
        if (err){
            // mysql 模块工作期间报错了
            return console.log(err.message)
        }
    
        // 能够成功执行 SQL 语句
        console.log(results)
    })
    复制代码

    log:

    Snip20220418_34.png


使用 mysql 模块操作 MySQL 数据库

当前数据库表中数据

Snip20220418_35.png

查询数据

  • 如果执行的是 select 查询语句,则执行的结果是数组

  • 示例

    查询 users 表中所有数据

    const sqlStr = 'select * from users'
    
    db.query(sqlStr, (err, results) => {
        if(err){
            return console.log(err)
        }
        console.log(results)
    })
    复制代码

    log:

    [
        RowDataPacket {
            id: 1,
            username: '孙悟空',
            password: '111111',
            status: '0'
        },
    
        RowDataPacket {
            id: 2,
            username: '猪八戒',
            password: '222222',
            status: '0'
        }
    ]
    复制代码

插入数据

  • 如果执行的是 insert into 插入语句,则执行的结果是个对象。可以通过 affectedRows 属性,来判断是否插入数据成功

  • 示例

    向 users 表中插入数据,其中 username 为 唐僧, password 为 333333

    // 新建一个 user 对象
    const user = {username:'唐僧', password:'333333'}
    
    // 要执行的 SQL 语句,其中英文的 ? 表示占位符
    const sqlStr = 'insert into users (username, password) values(?,?)'
    
    // 使用数组的形式,依次为 ?占位符指定具体的值
    db.query(sqlStr, [user.username, user.password], (err, results) => {
    
        if(err){
            return console.log(err.message)
        }
    
        if (results.affectedRows === 1) {
            console.log('插入数据成功')
        }
    })
    复制代码

    log:

    Snip20220418_36.png

  • 插入数据的便捷方式

    向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,可以通过 set ? 的方式快速插入数据

    const sqlStr = 'insert into users set ?'
    复制代码
  • 示例

    向 users 表中插入数据,其中 username 为 沙僧, password 为 444444

    // 新建一个 user 对象
    const user = {username:'沙僧', password:'444444'}
    
    // 要执行的 SQL 语句,其中英文的 ? 表示占位符
    const sqlStr = 'insert into users set ?'
    
    // 执行 SQL 语句
    db.query(sqlStr, user, (err, results) => {
    
        if(err){
            return console.log(err.message)
        }
    
        if (results.affectedRows === 1) {
            console.log('插入数据成功')
        }
    })
    复制代码

更新数据

  • 如果执行的是 update 插入语句,则执行的结果是个对象。可以通过 affectedRows 属性,来判断是否更新数据成功

  • 示例

    更新数据,将原数据库 id 为 1 的对象中,username 更新为 齐天大圣, password 更新为 aaaaaa

    // 定义要更新的 user 对象
    const user = {id:1, username:'齐天大圣', password:'aaaaaa'}
    
    // 要执行的 SQL 语句,其中英文的 ? 表示占位符
    const sqlStr = 'update users set username=?, password=? where id=?'
    
    // 执行 SQL 语句
    db.query(sqlStr, [user.username, user.password, user.id], (err, results) => {
    
        if(err){
            return console.log(err.message)
        }
        if (results.affectedRows === 1) {
            console.log('更新数据成功')
        }
    })
    复制代码

    log:

    Snip20220418_37.png

  • 更新数据的便捷方式

    更新表中数据时,如果数据对象的每个属性和数据表的字段一一对应,可以通过 set ? 的方式快速插入数据

    const sqlStr = 'update users set ?'
    复制代码
  • 示例

    更新数据,将原数据库 id 为 2 的对象中,username 更新为 天蓬元帅, password 更新为 bbbbbb

    // 定义要更新的 user 对象
    const user = {id:2, username:'天蓬元帅', password:'bbbbbb'}
    
    // 要执行的 SQL 语句,其中英文的 ? 表示占位符
    const sqlStr = 'update users set ? where id=?'
    
    // 执行 SQL 语句
    db.query(sqlStr, [user, user.id], (err, results) => {
    
        if(err){
            return console.log(err.message)
        }
        if (results.affectedRows === 1) {
            console.log('更新数据成功')
        }
    })
    复制代码

    log:

    Snip20220418_38.png

删除数据

  • 在删除数据时,根据 id 这样的唯一标识,删除对应的对象

  • 如果执行的是 delete 插入语句,则执行的结果是个对象。可以通过 affectedRows 属性,来判断是否更新数据成功

  • 示例

    删除 id 为 3 的 user 对象

    // 要执行的 SQL 语句,其中英文的 ? 表示占位符
    const sqlStr = 'delete from users where id=?'
    
    // 执行 SQL 语句
    db.query(sqlStr, 3, (err, results) => {
    
        if(err){
            return console.log(err.message)
        }
        if (results.affectedRows === 1) {
            console.log('删除数据成功')
        }
    
    })
    复制代码

    log:

    Snip20220418_39.png

标记删除

  • 使用 delete 语句,会把真正的数据从表中删除掉。为了保险起见,推荐使用标记删除的形式,来模拟删除的动作

  • 所谓的标记删除,就是在表中设置类似于 status 状态的字段,来标记当前这条数据是否被删除。当用户执行了删除动作时,并没有执行 delete 语句把数据删除掉,而是执行了 update 语句,将这条数据对应的 status 字段标记为删除即可

  • 示例

    使用 update 语句替代 delete 语句,只更新数据的状态,并没有真正的删除数据

    // 要执行的 SQL 语句,其中英文的 ? 表示占位符
    const sqlStr = 'update users set status=? where id=?'
    
    // 执行 SQL 语句
    db.query(sqlStr, [1, 4], (err, results) => {
    
        if(err){
            return console.log(err.message)
        }
    
        if (results.affectedRows === 1) {
            console.log('标记删除数据成功')
        }
    })
    复制代码

    log:

    Snip20220418_40.png

猜你喜欢

转载自juejin.im/post/7087865169648287758