使用nodejs操作mysql数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 使用nodejs操作mysql数据库

使用nodejs操作mysql数据库


Windows 安装新版 Docker

  1. 注册
  2. 下载
  3. 设置国内镜像

网络异常,图片无法展示
|
4. 确保 docker run hello-world 输出 Hello from Docker

安装 MySql

$ docker run --name zxj-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306  -d mysql:5.7.38
$ docker ps //用于查看container的运行状态 
$ docker exec -it mysql1 bash//用bash 执行
$ docker kill zxj-mysql //关掉容器
$ docker container start mysql1 //启动MySQL
$ mysql1 mysql -u root -p//使用root权限登录

连接数据库

用node js操作数据库。只不过node的原生模块里并没有集成mysql,需要额外安装一个mysql模块: 搜索nodejs mysql,就是这个库的github官网

1.增删改查

$ CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;//创建数据库 
$ create table users(id serial,name text);//创建表 
$ show databases;//查看所有的数据库 use dataName;//使用dataName数据库 
$ show tables;//查看所有表 
$ select * from user;//查看user表的全部内容 
$ describe user;//查看user的描述字段 
$ insert into user(name,age) values('alsan',18)//插入数据 
$ delete from user where name = 'gouzi';//删除名为gouzi的数据 
$ update user set age=70 where name='aslan';//将名字为aslan的年龄更新,如果不写name会将数据库全部内容更改
$ alter table user add id serial;//添加自增长的id(序列号);

2.按照官网的例子,创建一个test.js,

首先引入mysql模块。使用mysql.createConnection创建一个连接对象。提供要连接的MySQL服务器上的详细信息。接受一个对象作为参数,需要传host,user等参数。

这里要想连接成功,就要先在本地用docker拉取一个mysql。因为我下载的是旧版的docker,也就是docker toolbox,所以要把host对应的'localhost'替换成我启动docker quickstart后得到的那个IP。也可以在命令行用docker-machine ip得到。如果是新版docker或者max linux系统,就不用替换。

const mysql      = require('mysql');
const connection = mysql.createConnection({
  host     : 'localhost', //连接的数据库地址。(默认:localhost)
  user     : 'me',    //mysql的连接用户名
  password : 'secret',    // 对应用户的密码
  database : 'my_db'      //所需要连接的数据库的名称(可选)
});
connection.connect();
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});
connection.end();

接下来在连接对象上调用connect方法连接到MYSQL数据库服务器。

Connection.query方法可以用来查询,并且执行任意正确的sql语句。接受第一个参数就是一个sql语句字符串,第二个参数是执行sql语句后的回调函数。

最后用connection.end()关闭连接。

这个mysql库就相当于一个mysql客户端,通过发送一些sql命令到服务器,由服务器从数据库里读/写数据,然后把读到的数据再发回来。

3.创建数据库,表

//test.js
const mysql= require('mysql');
const connection = mysql.createConnection({
    host: '192.168.99.100',
    port:3306,
    user: 'root',
    password: '123456',
});
connection.connect();
connection.query('CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;', function (error, results, fields) {
    if (error) throw error;
    console.log('创建数据库')
    console.log(results)
});
connection.query('use mydb;')
connection.query(`CREATE TABLE IF NOT EXISTS myuser(
        name text,
        age int
    )`, function (error, results, fields) {
    if (error) throw error;
    console.log('创建表')
    console.log(results)
});
connection.end();

1. 创建数据库的sql语句

还是用connection.query执行创建数据库的sql语句。这个sql语句完整的写法:'CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;'

创建数据库,然后要写IF NOT EXISTS 如果不存在就创建,存在自然就不需创建了。后边跟着要创建的数据库的名字。

永远不要使用mysql的utf-8,因为这个bug还没有修复,要用utf8mb4这种编码。

2. 创建表

要想创建一个表,就要先进入某个数据库,在这个数据库里创建表。否则就会报错。

connection.query('use mydb;')
复制代码

这个sql语句可以看到和命令行里的一样,use 某个数据库。

如果直接创建表:CREATE TABLE IF NOT EXISTS myuser 会报错,说表里至少要有一列数据;所以创建表的同时要往里写入一些数据,语法就是用()包起,直接写在表名后。外边的包字符串的''也要改成一对反引号。

3. 运行

然后运行node test.js 这样就是成功了:

网络异常,图片无法展示
|

4. 命令行验证

在命令行里依次连接,进入mysql,用show databases;命令查看现有数据库,可以看到 mydb数据库被创建了。

网络异常,图片无法展示
|

然后使用这个数据库use mydb; 查看这个数据库里的表 show tables; 查看某个表的具体内容,会展示表中的列及其所有属性 describe myuser; 可以看到我们创建了myuser这个表,和写入表内的数据

网络异常,图片无法展示
|

Sequelize

如果直接使用这个mysql包提供的接口访问数据库,我们编写的代码就比较底层,因为是直接写SQL命令来访问的。

其实数据库的表是一个二维表,可以有多行多列。这个表的结构可以映射成一个JS对象,每一行都可以用一个对象来表示。每个列的字段就是对象里的每个属性。这个就是ORM技术:Object-Relational Mapping 就是把关系数据库的表结构映射到对象上

那由谁来做这个转换呢?就是ORM框架,Sequelize就是这种ORM框架,可以让我们读写JS对象,它帮我们把对象变成表中的每行。

Sequelize官方文档

按照文档来做,实现的都比较简单。

const { Sequelize,Model, DataTypes} = require('sequelize');
const sequelize = new Sequelize('HU', 'root', '123456', {
    host: '192.168.99.100',
    dialect: 'mysql'
});
class User extends Model {}
User.init({
    username: DataTypes.STRING,
    age:DataTypes.INTEGER
}, { sequelize, modelName: 'user' });
(async () => {
    await sequelize.sync();
    const jane = await User.create({
    username: 'janedoe',
    birthday: new Date(1980, 6, 20)
    });
    const users_name = await User.findAll({
        where: {
            username:'huanqi'
        }
    });
    console.log("All users:", JSON.stringify(users_name, null, 2));
})();

Sequelize的核心概念就是模型。在Sequelize里,模型就是一个继承了Model的类,它相当于数据库里的一张表的结构。由这个类创建出来的一个实例对象,相当于表里的一行。

首先new Sequelize创建一个sequelize连接对象,包含了连接到的mysql数据库的信息。然后声明一个模型叫User。用User.init对这个模型初始化,就是对表初始化,有哪些属性(列)及其数据类型。第二个参数就是要连接的对象。

Sequelize.sync()用来同步我们这个模型和表,因为可能表已经存在,或者有不同的列,所以要先同步一下。

User.create 用模型创建一个实例对象,就是在表中添加一行数据。这个都是异步的,相当于一个promise,所以用await非常简洁。

User.findAll 用于查询

测试题

网络异常,图片无法展示
|

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
SQL 运维 关系型数据库
MySQL 中 GRANT 操作会引起复制中断吗?
GRANT 操作并不是一个原子性操作,不管执行成功与否,都会触发一个隐式重载授权表的行为。 在生产环境中需要规范用户创建及授权的操作,不推荐使用 DML 语句去直接变更 mysql.user 表,可能会引发其他的问题,若使用了 DML 语句进行变更, 需要手工执行 flush privileges。
72 4
|
5月前
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
71 0
|
19天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
2月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
2月前
|
SQL JavaScript 关系型数据库
Node.js 连接 MySQL
10月更文挑战第9天
30 0
|
3月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
47 0
Node服务连接Mysql数据库
|
4月前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
94 3
|
4月前
|
SQL JavaScript 前端开发
node.js使用Sequelize操作数据库
node.js使用Sequelize操作数据库
|
5月前
|
存储 关系型数据库 文件存储
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
52 2
|
5月前
|
SQL Java 数据库
MySQL设计规约问题之为什么应尽量避免使用子查询,而可以考虑将其优化为join操作
MySQL设计规约问题之为什么应尽量避免使用子查询,而可以考虑将其优化为join操作