likes
comments
collection
share

操作数据库

作者站长头像
站长
· 阅读数 17

Docker x MySQL

Windows安装Docker

  • 注册一下

  • 打开 控制面板->程序->启用或关闭Windows功能->开启 Hyper-V 与 适用于 Linux 的 Windows 子系统 这两个选项

  • 注意:在安装过程中请勿勾选 wsl 相关选项,以确保软件使用的虚拟机就是我们第1步中开启的 Hyper-V

  • 安装Docker Desktop

  • 确保docker --version 返回版本号

Docker安装MySQL

  • 进入Docker上面MySQL的 主页
  • 选择版本,如5.7.27或者8.0.18
  • 使用docker run 命令启动容器
  • name 是容器的名字
  • MYSQL_ROOT_PASSWORD是密码
  • tag是版本号,我们用5.7.27
  • 再加一个端口映射 -p 3306:3306(第一个是本机的端口号,第二个是虚拟机的端口号)
  • -d 就是以守护进程的方式,就是不断掉,一直开着
  • 最终命令docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.27

为什么要使用docker安装MySQL,因为使用docker安装就不用管本地的环境了(如:端口冲突,软件冲突)

操作数据库

那一串数字,就是运行的MySQL容器的id

如何知道是否安装成功? 运行docker ps: 意思是查看进程

操作数据库

一些有用的Docker命令

命令

  • 运行docker ps 查看容器运行状态
  • 运行docker kill mysql1 关掉容器
  • 运行docker container start mysql1 开启关掉的容器
  • 运行docker rm mysql1 删掉容器,必要时可加 -f 选项
  • 如果发现容器不能重新启动,那么就运行 docker run 启动新容器(如:docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=12345 -P 3306:3306 -d mysql:5.7.27)
  • docker login -u "myusername" -p "mypassword" docker.io登录

注意

  • 用Docker 运行的容器(小型的虚拟机),默认不会持久化
  • 也就是说如果容器被删掉了,那么数据也没了
  • 如果需要持久化,搜索 『docker mysql 数据目录持久化』
  • 学习阶段不需要持久化

如何用命令行连接mysql

Docker exec命令

  • winpty docker exec -it mysql1 bash

操作数据库

  • 这句命令会进入容器,容器里有一个Linux系统
  • 然后你就可以在这个系统里运行mysql

mysql命令

  • mysql -u root -p 回车,然后输入密码 123456,就进入数据库了

操作数据库

  • 命令 show databases; 可查看数据库列表

操作数据库

这四个数据库是MySQL内置的,我们不能删,也不能改

  • 如果你手动忘了写分号就回车了,就补一个分号或者按ctrl + C 重来

  • 如何使用数据可呢?

    命令 use xxx; 可选择使用xxx 数据库。

    命令 use mysql; 我们试试默认的mysql数据库

    操作数据库

    这样我们就进入了mysql数据库了

  • 如果想看数据库有哪些表那么办?

    命令 show tables; 查看所有表

    操作数据库

  • 如果想查看其中一个表的内容呢?

    命令 select * from user; 查看表内容

    如果不知道表名,可以按Tab键,它会给提示

    操作数据库

    可以看出共有4个用户

这样,我们就可以查到Docker里面的Linux里面的MySQL里面的数据库里面的表!!

命令行尝试

Ctrl + C

用于终端,比如你输错命令了

Ctrl + D

用于退出,比如你要退出mysql、bash等

如下图所示:

  • 在MySQL中按Ctrl + D,退出数据库,来到Linux中。

  • 再按Ctrl + D 退出Linux,到Windows中的bash命令

操作数据库

小结

  1. 使用 Docker 一键安装MySQL
  2. 进入容器运行 mysql命令
  3. 在mysql命令行执行SQL语句

数据库基础概念

什么是数据库

数据库 Database

  • 将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库
  • 根据保存格式的不同,数据库一般被分为:
    • 关系数据库(中型数据库) - 使用最广泛的数据库
    • 面向对象数据库、XML数据库、键值存储系统(超小或超大的系统,如Redis)、层次数据库

数据库管理系统DBMS

Data Base Mananger Systerm

  • 用来管理数据库的系统称为数据库管理系统
  • 如MySQL(用的人多,适合学习)、PostgreSQL、SQL Server(微软)、DB2(IBM)、Oracle

备注:PostgreSQL的用法基本和MySQL一样,性能和功能比mysql好,推荐使用

DBMS的结构

操作数据库

MySQL就相当于erver服务端

我们使用的mysql命令,就是一个客户端

而mysql背后还有一个server在24小时不间断运行着

我们在Docker中安装的Mysq能不能用一些GUI的软件,也就是图形界面的软件来访问呢?

是可以的,只需要连上图中的Server服务端,只需要提供地址、端口、用户名和密码就可以连了

Node.js连接数据库

连接MySQL && 创建数据库

新建文件MYSQL-1/test/js

我们需要借助npm上的一个库,这个库就叫 mysql

直接看能运行的代码: yarn add mysql

首先要创建数据库,(Google: sql create database 菜鸟),使用CRM学习法,copy mysql文档中能运行的代码

为了解决中文编码的问题,我们需要设置使用utf-8,但是MySQL的utf-8是一个bug,而是应该使用utf8mb4

connection.query('CREATE DATABASE IF NOT EXISTS lg DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_520_ci;', function (error, results, fields) {
    if (error) throw error;
    console.log(results);
});

上面的代码可能多次运行,如果第一次运行就会创建数据库,如果第二次运行就又创建一个数据库,第二次运行就会报错,能不能做到,没有就创建,有就不创建?

Google: mysql create database if not exists,经过搜索知道只要在创建数据库后加IF NOT EXISTS

意思就是如果没有叫lg的数据库,就创建一个lg的数据库

运行test.js,node test.js

操作数据库

那我们怎么知道有没有成功创建数据库lg呢?

运行show databases;

操作数据库

我们可以看见lg数据库已经创建成功了

这样我们就使用Node.js连接Mysq并创建一个数据库的过程!!!

创建表

创建表就和创建数据库类似了

// 连接数据库
const mysql = require('mysql');
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '123456'
});

connection.connect();

// 创建数据库
connection.query('CREATE DATABASE IF NOT EXISTS lg DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_520_ci;', function (error, results, fields) {
    if (error) throw error;
    console.log('创建数据库');
    console.log(results);
});

// 指定使用的数据库
connection.query('use lg;')

// 创建表
connection.query(`CREATE TABLE IF NOT EXISTS user(
    name text,
    age int
)`, function (error, results, fields) {
    if (error) throw error;
    console.log('创建表');
    console.log(results);
});

connection.end();

备注

  • 创建表之前要连接数据库,否则它不知道要往哪个数据库中创建表
  • 创建表的时候只要初始化一列数据

运行test.js,node test.js

操作数据库

我们可使用命令行验证一下是否是这样

操作数据库

以上就是用Node.js连接数据库,然后创建一个数据库,创建一个表的过程(像操作MySQL命令行一样操作数据库)

SQL示例

对表的操作

删除表

删除表,在命令行中执行DROP table user;

同样的,删除数据库,在命令行中执行 drop database lg;

如果再次运行node test.js 就会重新创建lg数据库,user表

查询表

先说明使用哪个数据库

use lg

再查询表

show tables

创建表

和前面在代码中写法的一样,只是挪到命令行中执行

修改表

一般不要轻易对表进行重命名

如何添加记录

菜鸟教程搜『MySQL』插入数据

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

操作数据库

操作数据库

如何删除记录

菜鸟教程搜『MySQL』删除数据

DELETE FROM table_name
WHERE condition;

操作数据库

如何修改记录

菜鸟教程搜『MySQL』修改数据

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

操作数据库

如果表中有多行数据,没有写where条件,那么SET的值就会影响表中的所有数据

警告: 不要轻易自己写update语句或者delete 语句,因为如果不小心忘了写where语句,那么整个表就毁了

如何查记录

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
  • 你可以使用 LIMIT 属性来设定返回的记录数。
  • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0

操作数据库

在表中增加一列

mysql>再写LTER TABLE testalter_tbl ADD i INT;

操作数据库

操作数据库

我们没有给用户对应的ID啊,为什么它们默认有id呢?

这就是serial(序列号)类型的方便之处,用了它,就不用为id添加特殊的类型了

后续更多的数据库操作,放到后面再学,暂时掌握对数据库中表数据的增删改查即可

CRM学习法

  • 了解如何用Node.js连接mysql server
  • 了解如何创建数据库
  • 了解如何创建表(注意编码)
  • 了解如何对表增删改查
  • 了解如何增加记录
  • 了解如何对记录增删改查

推荐文档

在输入框中搜postgreSQL按一下Tab键进入到postgreSQL文档,这样就可以在它的文档中搜想要的API了

MySQL数据类型

五大类

  • 数字类型
  • 字符串类型
  • 时间和日期类型
  • JSON类型(5.7.8以上)
  • 其他特殊类型

数字类型

  • bit
  • tinyint
  • bool,boolean
  • smallint
  • mediumint
  • int
  • bigint
  • decimal(十进制)
  • float(单精度浮点数)
  • double(双精度浮点数)
  • serial(序列号)等价于 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
  • 具体看官方文档其中“[]”表示可选

字符串类型

  • char(100) ===> 永远是固定字节长度
  • varchar(100) ===> 根据字符串长度,可变字节长度,节省空间
  • binary(二进制)(1024) ===> 如数据库中存图片,那么它的类型就是
  • varbinary(1024)
  • blob ===> 长二进制,可以存大尺寸图片
  • text ===> 长字符串,如博客处理长文
  • enum('v1',v2) ===> 枚举,字符串要么是v1,要么是v2,只能二选一
  • set('v1',v2) ===> 集合,v1 | |v2 或者 v1 && v2
  • 具体看文档

时间和日期类型

  • date ==> 只有年月日
  • time ==> 只有时分秒
  • datetime ==> 年月日时分秒
  • timestamp ==> 时间戳(距离1970年0时0分过了多少秒)
  • year
  • 具体看官方文档

传给前端的时候要把时间转成 ISO 8601 格式

下图标记的就是ISO 8601 时间格式,它是字符串,使用JS的Date对它进行解析

操作数据库

ORM之Sequalize

ORM ---- Object-relational-mapping,像操作对象一样操作数据库

Sequealize.js

入门

  • 打开文档,找到Get Started
  • 使用CRM学习法快速入手

目标

  • 创建数据库
  • 创建表,表的增删改查
  • 创建记录,记录的增删改查
  • 创建记录,记录的增删改查

使用Squealiz连接数据库

CRM直接开干

安装一下yarn add sequelize

再安装它的类型声明文件,方便写代码的时候自动提示

yarn add --dev @types/sequelize

这里使用sequelize的v5版本

Copy


const { Sequelize, Model, DataTypes } = require('sequelize'); 

//默认是sqlite,但是我们需要使用MySQL
const sequelize = new Sequelize('sqlite::memory:'); 

class User extends Model {} 
User.init({ 
    username: DataTypes.STRING, 
    birthday: DataTypes.DATE 
    }, { sequelize, modelName: 'user' }); 
    
sequelize.sync()
    .then(() => User.create({ u
      sername: 'janedoe', 
      birthday: new Date(1980, 6, 20)
   }))
    .then(jane => {
      console.log(jane.toJSON()); 
    });

Dialects: 方言的意思就是它支持不同的数据库

操作数据库

Modify && Run

1. 增加数据

const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('lg', 'root', '12345', {
    //host:'docker-machine ip'
    dialect: 'mysql'
})

// 创建 User 模型
class User extends Model {}

// 初始化 User
User.init({
    username: DataTypes.STRING,
    birthday: DataTypes.DATE
    // modelName 意思就是表的名字
}, { sequelize, modelName: 'user' });

// 同步到数据库
sequelize.sync()
    // 创建一条数据
    .then(() => User.create({
        username: 'janedoe',
        birthday: new Date(1980, 6, 20)
    }))
    // 打印结果
    .then(jane => {
        console.log(jane.toJSON());
    });

使用命令行连接数据库并进入数据库

操作数据库

代码运行结果

操作数据库

验证一下,确实创建了一个users表,并添加了一条数据

它会自动创建id、updatedAt、createdAt

操作数据库

操作数据库

这样我们就做到了创建数据

2. 查询数据

操作数据库

const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('lg', 'root', '12345', {
    //host:'docker-machine ip'
    dialect: 'mysql'
})

// 创建 User 模型
class User extends Model {}

// 初始化 User
User.init({
    username: DataTypes.STRING,
    birthday: DataTypes.DATE
    // modelName 意思就是表的名字
}, { sequelize, modelName: 'user' });

// 查询数据
async function run () {
    const users = await User.findAll();
    console.log(JSON.stringify(users));
    // 关闭数据库连接
    await sequelize.close()
}
run()

操作数据库

3. 删除数据

操作数据库

const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('lg', 'root', '12345', {
    //host:'docker-machine ip'
    dialect: 'mysql'
})

// 创建 User 模型
class User extends Model {}

// 初始化 User
User.init({
    username: DataTypes.STRING,
    birthday: DataTypes.DATE
    // modelName 意思就是表的名字
}, { sequelize, modelName: 'user' });

// 删除数据
User.destroy({
    where: {
        id: 1
    }
});

// 查询数据
async function run () {
    const users = await User.findAll();
    console.log(JSON.stringify(users));
    // 关闭数据库连接
    await sequelize.close()
}
run()

代码执行结果:

操作数据库

从上图可以看出如果使用sequelize就不需要自己写SQL,我们只需要看文档,然后抄代码,改代码就可以了,它会帮我们执行SQL查询语句

以上就是如何使用Node.js来使用sequelize.js连接数据库,对数据进行增删改查