你学废了吗:node使用mysql

2023年 11月 17日 81.9k 0

如果要接触后端,数据库肯定是必不可少的内容。作为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数据库的内容。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论