在NodeJS中操作数据库的步骤

安装操作 MySQL 数据库的第三方模块(mysql

1
npm i mysql -s

通过 mysql 模块连接到 MySQL 数据库

1
2
3
4
5
6
7
8
9
10
// 1. 导入 mysql 模块
var mysql = require('mysql')

// 2. 建立与 mysql 数据库的连接
var db = mysql.createPool({
host: '127.0.0.1', // 数据库的 ip 地址
user: 'root', // 登录数据库的账号
password: 'toor', // 登录数据库的密码
database: 'my_db_01' // 指定要操作哪个数据库
})

注意:如果出现error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by serv的报错

原因:

  • 导致这个错误的原因是,目前,最新的mysql模块并未完全支持MySQL 8的“caching_sha2_password”加密方式,而“caching_sha2_password”在MySQL 8中是默认的加密方式。

可以在MySQL Workbench 里面执行下面代码解决

1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码'

转载自https://blog.csdn.net/sufubo/article/details/104108095

通过 mysql 模块执行 SQL 语句

1
2
3
4
5
6
7
8
// 查询 users 表中所有的用户数据
db.query('select * from users', (err, results) => {
// mysql 模块如果错误,err 中会返回错误信息
if (err) return console.log(err.message)

// 只要能打印出 [ RowDataPacket { '1': 1 }] 的结果,就证明数据库连接正常
console.log(results)
})

使用 insert into 语句插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
// 3. 声明要插入到 users 表中的数据对象
const user = { username: 'tom', password: '123456' }
// 4. 待执行的 sql 语句,其中英文的 ? 表示占位符
const sqlstr = 'insert into users (username, password) values (?, ?)'

// 5. 使用数组的形式,依次为 ? 占位符指定具体的值
db.query(sqlstr, [user.username, user.password] ,(err, results) => {
// 插入失败
if (err) return console.log(err.message)

// 插入成功
if (results.affectedRows === 1) { console.log('插入数据成功') }
})

插入数据的便捷方式

1
2
3
4
5
6
7
8
9
10
11
12
13
// 3. 声明要插入到 users 表中的数据对象
const user = { username: 'jerry', password: '123456' }
// 4. 待执行的 sql 语句,其中英文的 ? 表示占位符
const sqlstr = 'insert into users set ?'

// 5. 使用数组的形式,依次为 ? 占位符指定具体的值
db.query(sqlstr, user ,(err, results) => {
// 插入失败
if (err) return console.log(err.message)

// 插入成功
if (results.affectedRows === 1) { console.log('插入数据成功') }
})

使用 update 语句更新数据

1
2
3
4
5
6
7
8
9
10
11
12
13
// 3. 声明要插入到 users 表中的数据对象
const user = { id: 7, username: 'spike', password: '123000' }
// 4. 待执行的 sql 语句
const sqlstr = 'update users set username=?, password=? where id=?'

// 5. 调用 db.query() 执行 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('更新数据成功') }
})

更新数据的便捷方式

1
2
3
4
5
6
7
8
9
10
11
12
13
// 3. 声明要插入到 users 表中的数据对象
const user = { id: 7, username: 'spike', password: '123000' }
// 4. 待执行的 sql 语句
const sqlstr = 'update users set ? where id=?'

// 5. 调用 db.query() 执行 SQL 语句的同时,使用数组依次为占位符指定具体的值
db.query(sqlstr, [user, user.id] ,(err, results) => {
// 更新失败
if (err) return console.log(err.message)

// 更新成功
if (results.affectedRows === 1) { console.log('更新数据成功') }
})

使用 delete 语句删除数据

  • 注意:如果 sql 语句中有多个占位符,则必须使用数据为每个占位符指定具体的值,如果 sql 语句中只有一个占位符,则可以省略
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 3. 要执行的 sql 语句
    const sqlstr = 'delete from users where id=?'

    // 2. 调用 db.query() 执行 SQL 语句的同时,为占位符指定具体的值
    // 注意:如果 sql 语句中有多个占位符,则必须使用数据为每个占位符指定具体的值
    // 如果 sql 语句中只有一个占位符,则可以省略
    db.query(sqlstr, 7 ,(err, results) => {
    // 删除失败
    if (err) return console.log(err.message)

    // 删除成功
    if (results.affectedRows === 1) { console.log('删除数据成功') }
    })

标记删除

  1. 使用 DELETE 语句,会把真正的把数据从表中删除掉
  2. 为了保险起见,推荐使用标记删除的形式,来模拟删除的动作
  • 标记删除,就是在表中设置类似于 status 这样的状态字段,来标记当前这条数据是否被删除
  1. 当用户执行了删除的动作时,我们并没有执行 DELETE 语句把数据删除掉,而是执行了 UPDATE 语句,将这条数据对应的 status 字段标记为删除即可
1
2
3
4
5
6
7
8
9
10
11
// 3. 要执行的 sql 语句
const sqlstr = 'update users set status=1 where id=?'

// 2. 调用 db.query() 执行 SQL 语句的同时,为占位符指定具体的值
db.query(sqlstr, 1 ,(err, results) => {
// 删除失败
if (err) return console.log(err.message)

// 删除成功
if (results.affectedRows === 1) { console.log('删除数据成功') }
})