1.查询数据
你可以按以下方式,通过连接对象 db.query() 方法来发起查询:
// const db = mysql.createPool({...options})// 查询 user表中的所有数据db.query('select * from user', (err, results) => {// 查询失败if (err) return console.log(err);// 查询成功// 注意:如果执行的是 select 查询语句,则返回结果是一个数组console.log(results);})
注意:如果执行的是 select 查询语句,则返回结果是一个数组
2.插入数据
你可以在构造插入语句时使用问号? 作为占位符(和其他编程语言一样)。然后你可以在 db.query() 方法的第二个参数中,以数组的方式依次替换占位符,只能是数组变量。
然后,如果插入成功,你可以通过results对象的affectedRows属性,来判断是否执行成功。
// 01 定义要插入到user表中的数据对象const user = { username: 'xiaoming', id: 2 }// 02 定义待执行的 SQL 语句, 其中 ? 表示占位符 (和java一样)const sqlStr = 'insert into use (username, id) values (?, ?)'// 03 使用数组的形式,在query方法的第二个参数,依次为 ? 占位符指定具体的值db.query(sqlStr, [user.username, user.id], (err, results) => {// 执行失败if(err) return console.log(err.message);// 执行成功// 注意:如果执行的是 insert 插入语句,则 results是一个对象 可以通过affectedRows属性判断是否插入成功。//可以用resulte中的影响行数(affectedRows)属性来判断是否插入成功// console.log(results);if(results.affectedRows === 1) console.log('插入成功');})
注意:如果执行的是 insert 插入语句,则 results是一个对象,可以通过affectedRows属性判断是否插入成功。
插入数据的便捷(对象)方法
如果一行数据的属性很多,那么在构造sql语句的时候就要写很多占位符了,这是很麻烦的,所以有了便捷方法:
其中 set 表示用一个集合来插入数据,前提是集合中的每个属性都与数据表中的列名一一对应(除了非空和必须),可空的属性可以不写。才可用快捷方式。而且不用数组方式,直接JS对象方式。
// 插入数据的便捷方式const userInfo = { username: 'xiaohong', id: 4 }// 02 定义待执行的 SQL 语句, 其中 set 表示用一个集合作为插入数据,在JS中就是对象const sqlStr = 'insert into user set ?'// 03 使用对象的形式,在query方法的第二个参数,为 ? 占位符指定具体的对象db.query(sqlStr, userInfo, (err, results) => {// 执行失败if (err) return console.log(err.message);// 执行成功if (results.affectedRows === 1) console.log('插入成功');})
3.更新数据
可以通过如下方式,更新数据,也是使用query方法。在第二个参数提供数组数据。
// 01 定义要更新的数据对象const user = { id: 2, username: 'chongchong', password: '123' }// 02 定义待执行的 SQL 语句, 其中 ? 表示占位符 (和java一样)const sqlStr = 'update user set username = ?, password = ? where id = ?'// 03 使用数组的形式,在query方法的第二个参数,依次为 ? 占位符指定具体的值db.query(sqlStr, [user.username, user.password, user.id], (err, results) => {// 执行失败if(err) return console.log(err.message);// 执行成功// 注意:如果执行的是 update 更新语句,则 results 是一个对象if(results.affectedRows === 1) console.log(`成功更新${results.affectedRows}条数据`);})
注意:如果执行的是 update 更新语句,则 results也是一个对象 可以通过affectedRows属性判断是否插入成功。
更新数据的便捷方式
得益于sql语句的功能性,更新也可以像插入一样,通过 SET 关键字来指定一个对象作为更新数据。
// 更新数据的便捷方式const user = { id: 2, username: 'chongchong', password: '123456' }// 定义待执行的 SQL 语句, 通过set关键字 指定一个对象作为更新数据const sqlStr = 'update user set ? where id = ?'// 注意:由于还是有多个占位符,所以仍然要使用数组的形式,在第二个参数,依次为 ? 占位符指定具体数据db.query(sqlStr, [user, user.id], (err, results) => {// 执行失败if(err) return console.log(err.message);// 执行成功if(results.affectedRows === 1) console.log(`成功更新${results.affectedRows}条数据`);})
注意:只要sql语句中有多个占位符,就必须使用数组的形式来依次为 ? 占位符指定具体数据,sql语句中 set关键字 后的 ? 可以是一个对象。
4.删除数据
看来mysql模块的增删改查都是用query方法的,只是 sql 语句不同而已,和python一样呢。
在删除数据时,建议以主键作为唯一标识,来删除对应的数据:
// 定义待执行的 SQL 语句const sqlStr = 'delete from user where id = ?'// 注意:只要有多个占位符,就必须使用数组形式提供参数,依次为 ? 占位符指定具体数据。// 如果只有一个占位符, 则可以无视数组db.query(sqlStr, 2, (err, results) => {// 执行失败if(err) return console.log(err.message);// 执行成功if(results.affectedRows === 1) console.log(`成功删除${results.affectedRows}条数据`);console.log(results);})
注意:注意:只要有多个占位符,就必须使用数组形式提供参数,依次为 ? 占位符指定具体数据。
如果只有一个占位符, 则可以无视数组。
5.标记删除(伪删除/软删除/回收站机制)
使用 delete 语句,会把数据真正的从数据库中删掉,这实际上是不安全的,用户的误操作可能会摧毁整个数据库。为了保险起见,推荐使用标记删除的形式,来模拟删除的操作。
所谓标记删除,其实就是一个伪删除操作,现在通常都是加 is_active 或 status 这样的状态字段进行判断,来标记当前这条数据是否被视为删除,比如为0表示删除。类似文件系统的回收站机制。是可恢复的。
当用户执行删除操作时,我们使用 update 语句来代替delete,将这条数据的 is_active 或 status 标记为删除即可。在真正需要从数据库中移除数据时再使用 delete 。
// 标记删除(伪删除/回收站机制)// 将 delete改为 update,只修改删除标记,来将该数据视为被删除的状态,类似回收站机制,是可恢复也可彻底删除的// 本例中 is_active 标记为0是视为删除const sqlStr = 'update user set is_active = ? where id = ?'db.query(sqlStr, [0, 1], (err, results) => {// 执行失败if (err) return console.log(err.message);// 执行成功if (results.affectedRows === 1) console.log(`成功删除${results.affectedRows}条数据`);})
查询数据表删除前后的状态:
//删除前 删除标记为1mysql> select * from user;+----+----------+----------+-----------+| id | username | password | is_active |+----+----------+----------+-----------+| 1 | xiaohong | 123 | 1 |+----+----------+----------+-----------+1 row in set (0.00 sec)//删除后 删除标记为0mysql> select * from user;+----+----------+----------+-----------+| id | username | password | is_active |+----+----------+----------+-----------+| 1 | xiaohong | 123 | 0 |+----+----------+----------+-----------+1 row in set (0.00 sec)
