如果要接触后端,数据库肯定是必不可少的内容。作为nodejs的开发者,node优秀的mysql框架也不少,例如:Bookshelf、Sequelize、Typeorm等等。本文介绍下nodejs中mysql的基础用法。
mysql安装
不管你的系统是windows、mac还是Linux,通过源码编译、工具安装、安装包安装等方法都可以完成。不过呢,这些方式安装还是比较麻烦,中间还容易出错导致问题,而且如果搞出问题想要卸载也麻烦。所以今天我们换一个简单的方法:使用docker。
安装docker
个人PC的直接下载安装包安装docker桌面版即可:www.docker.com/products/do…
docker安装mysql
docker安装成功后,打开docker,待docker启动成功后,打开命令行工具,开始安装mysql。
获取mysql的镜像
使用search命令查看可用的mysql镜像
docker search mysql
这个命令可以检索出关键字相关的镜像
如果需要特定版本的mysql镜像,也可以在mysql的镜像列表中查找:hub.docker.com/_/mysql?tab…
打开tags标签,可以挑选需要的mysql版本
拉取镜像
我这里对mysql的版本没有需求,直接拉取最新版本:
docker pull mysql:latest
pull成功后,查看mysql是否已经拉取成功:
docker images
创建容器
使用下面的命令启动mysql容器:
docker run --name local-mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 -ti mysql
简单解释该命令:
- run 创建容器
- --name 容器的名,这里命名为local-mysql
- -p 将主机的端口与容器的端口映射,这里将主机的13306端口映射到容器的3306端口(3306端口为mysql的默认端口)
- -e 设置环境变量,这里设置MYSQL_ROOT_PASSWORD值为123456,这个变量是设置mysql的root账号的密码
- -it 以交互模式运行容器,并为其分配一个伪的输入终端
- mysql 使用mysql的镜像
执行成功后,可以再docker桌面端看到对应的容器
创建database
先打开mysql容器,直接在docker桌面端,点击输入终端的按钮直接打开容器终端:
也可以使用命令行打开:
docker exec -it local-mysql bash
进入mysql
mysql -u root -p
根据提示输入密码,进入mysql:
创建database
现在创建一个名为demo的库:
CREATE DATABASE demo
CHARACTER SET 'utf8mb3'
COLLATE 'utf8mb3_general_ci';
这个命令的意思是创建一个DATABASE,名为demo,字符集(字符数据类型)使用utf8mb3编码(utf8编码,支持存储3个字节长的字符),排序规则为utf8mb3_general_ci,其中"general"表示使用一般的排序规则,"ci"表示不区分大小写。
好了,数据库搞定了,现在可以开始操作。
nodejs操作mysql
安装mysql模块
执行安装命令:
npm install mysql
连接数据库
代码简单如下:
const mysql = require('mysql');
// 创建连接
const connection = mysql.createConnection({
host: 'localhost',
port: 13306,
user: 'root',
password: '123456',
database: 'demo'
});
// 连接数据库
connection.connect((err) => {
if (err) {
console.error('Mysql连接失败: ', err);
return;
}
console.log('Mysql连接成功');
});
// 使用完毕,关闭连接
connection.end((err) => {
if (err) {
console.error('Mysql连接关闭失败', err);
return;
}
console.log('Mysql连接成功');
});
执行代码,报错:
这个错误的问题产生的原因是:Mysql8使用的是'caching_sha2_password'的密码加密方式,而最新的node mysql模块并没有支持这个加密方式。
在docker终端可以查看mysql的版本:
解决连接报错
这个问题的解决办法有两个:
- 安装8以下的mysql版本
- 执行一下命令:
USE mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
打开mysql库,将root用户的密码加密方式修改为:mysql_native_password。
重新执行代码,连接成功。
建表
我们先创建一个用户表:
CREATE TABLE `user` (
`id` INT(4) PRIMARY KEY AUTO_INCREMENT,
`account` varchar(60) DEFAULT NULL COMMENT '用户账号',
`password` varchar(100) DEFAULT NULL COMMENT '密码',
`mobile` varchar(11) DEFAULT NULL COMMENT '手机号',
`created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户表';
CURD
添加用户
connection.query(
'insert into user set ?',
{account: 'a', password: '123', mobile:'12345678911'},
(error, results, fields) => {
if (error) throw error;
console.log('插入用户成功: ', results);
}
);
执行:
mysql模块本身没有提供批量插入的方式,如果想一次插入多条数据,可以这么写:
connection.query(
"insert into user(`account`, `password`, `mobile`) values ('b', '123', '12345678912'),('c', '123', '12345678912');",
(error, results, fields) => {
if (error) throw error;
console.log('插入用户成功: ', results);
}
);
查询用户
connection.query(
'select * from user',
(error, results, fields) => {
if (error) throw error;
console.log('查询结果: ', results);
}
);
获得查询结果:
结果里面的RowDataPacket是mysql模块查询返回的特定格式的对象,通常是只读的。简单点可以操作对象一样:
results.forEach(item => {
console.log(item.id);
console.log({ ...item});
});
如果不想要这个格式,那就JSON.parse(JSON.stringify(results))
转化一下。
更新用户
我们将id为1的用户的手机号改为12345678922
connection.query(
'update user set mobile = ? WHERE `id` = ?',
['12345678922', 1],
(error, results, fields) => {
if (error) throw error;
console.log('更新结果: ', results);
}
);
查询下数据
select * from user where id = 1;
删除用户
把id为2的用户删除:
connection.query(
'delete from user WHERE `id` = ?',
[2],
(error, results, fields) => {
if (error) throw error;
console.log('删除结果: ', results);
}
);
总结
本文是对使用mysql的简单用法总结,如果觉得写的还行,请点赞收藏鼓励下,后续我会带来更多关于node数据库的内容。