操作数据库
Docker x MySQL
Windows安装Docker
-
打开 控制面板->程序->启用或关闭Windows功能->开启
Hyper-V
与适用于 Linux 的 Windows 子系统
这两个选项 -
注意:在安装过程中请勿勾选 wsl 相关选项,以确保软件使用的虚拟机就是我们第1步中开启的 Hyper-V
-
确保
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命令
小结
- 使用 Docker 一键安装MySQL
- 进入容器运行 mysql命令
- 在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
- 了解如何创建数据库
- 了解如何创建表(注意编码)
- 了解如何对表增删改查
- 了解如何增加记录
- 了解如何对记录增删改查
推荐文档
- devdocs.io,记得开启
postgreSQL
在输入框中搜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对它进行解析
- 很多程序员处理不好日期数据,就是因为内不了解它
- 如何把日期输出为ISO 8601
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
连接数据库,对数据进行增删改查
转载自:https://juejin.cn/post/7250009632253231141