Node 基础 6:操作数据库

202 阅读5分钟

Docker

设置 Docker

1、下载 Docker Desktop for Windows;

2、命令行 docker --version ,返回版本号说明成功;

3、设置国内镜像,然后重启 Docker;

{
  "experimental":false,
  "registry-mirrors":[
    "http://f1361db2.m.daocloud.io"
  ]
}

4、打开 settings 报错:

解决方法:管理员身份运行 PowerShell,输入netsh winsock reset(重置系统内部目录的意思)然后重启 Docker。 image.png

image.png 5、确保 docker run hello-world 输出 Hello from Docker!

用 Docker 安装 MySQL

1、进入 Docker 上面 MySQL 的 主页;

2、选择版本;

3、两个端口号要相同,如 3306:3306

docker run --name mysql名字 -e MYSQL_ROOT_PASSWORD=密码 -p 本机端口号:容器端口号 -d mysql:版本

4、Docker 安装 mysql 的好处:不用管本机的环境,如果用windows 安装 mysql 的话,可能会有什么软件冲突、端口冲突之类的;

5、报错:unexpected EOF

原因:可能是网络不好,换个时间下载。 image.png

常用 Docker 命令

docker ps查看容器运行状态;

docker kill mysql1关掉容器;

docker container start mysql1 开启容器;

docker rm mysql 删除容器,必要时可加 -f 选项;

docker fun启动新容器。

Docker 注意事项

1、用 Docker 运行的容器,默认不会持久化;

2、如果容器被删掉了,那么数据也没了;

3、如果需要持久化,可搜索“docker mysql 数据目录如何持久化”

命令行

用命令行连接 mysql

1、docker exec -it mysql1 bash;mysql1 是容器名,默认命令是 bash;

2、这句命令会进入容器,容器里有一个 Linux 系统;

3、这样就可以在这个系统里运行 mysql。

mysql 命令

1、mysql -u root -p回车,输入密码。命令的意思是:要进入 mysql,用户是 root ,密码;

2、show databsaes; 可查看数据库列表,注意要写分号,忘了分号的号,可以ctrl + c 重来,默认有4个数据库,最好不要动它们;

3、use xxx选择使用 xxx 数据库;

4、show tables 查看所有表,如果不知道表名,可以先输入前几个字母,然后按 tab

5、select * from 表的名字 查看表内容;

6.describe 表名描述表;

6、ctrl + d 退出,比如要退出 mysql、bash 等;

7、docker-machine ip得到虚拟机的 ip;

8、命令行创建数据库:create database dbdemo character set utf8mb4 collate utf8mb4_unicode_ci;

9、使用 join 连接表:

image.png select users.name as uname,orders.amount as amount from users inner join orders on users.id = orders.user_id;

10、事务

start transaction;
语句1;
语句2;
语句3;
commit;
//只要有一句出错,则全都不生效;
//显示评论数时,第一步,新增记录;
//第二步,评论数加 1 ,可以用事务。

11、mysql 存储引擎 show engines;默认是 InnoDB,支持事务,遵循 ACID、支持行锁和外键;

12、索引;

//创建
create unique 索引名 on 表名(column_name(length));

show index in 表名  

总结

1、docker run --name mysql名字 -e MYSQL_ROOT_PASSWORD=密码 -p 本机端口号:容器端口号 -d mysql:版本 把 mysql 安装在一台电脑上;

2、docker container start mysql1 开启有 mysql 的电脑;

3、docker exec -it mysql1 bash 打开电脑上的 mysql1 软件;

4、mysql -u root -p 用账号和密码登录软件;

5、用 mysql 语句操作软件。

数据库

1、可以高效访问的数据集合称为数据库;

2、根据保存格式,分为:关系型数据库(最广泛)、面向对象型数据库;

3、DBMS:用来管理数据库的系统称为数据库管理系统,如:MySQL、PostgreSQL、SQL Server、DB2、Oracle。

Node.js 连接数据库

1、连接 yarn add mysql

2、创建数据库,复制代码,这样 node.js 客户端就连上了 mysql 服务器,然后就可以操作数据库;,注意 mysql 的 utf-8 是个 bug ,不要用,用 utf8mb4

//mysql创建数据库,并且指定编码utf8mb4,
//如果已存在,就不创建的SQL命令
CREATE DATABASE IF NOT EXISTS 数据库名 DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

运行命令后报错:

code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, image.png 原因:mysql8.0 默认的密码认证方案是 'caching_sha2_password',而目前node默认的密码认证方案是'mysql_native_password',所以即使密码是对的,但是却无法认证成功。

解决方案:

docder exec -it mysql名 bash  //进入要操作的数据库
mysql -u root -p;
alter user root identified with mysql_native_password by 'mysql密码';
//此时得到提示Query OK, 0 rows affected (0.01 sec),这里是修改密码的认证方式
flush privileges;
//此时得到提示Query OK, 0 rows affected (0.01 sec),这里是重启权限
exit

3、创建表 ;

`CREATE TABLE IF NOT EXISTS user(
    name text,
    age int
)`

4、对表增删改查

drop table 表名;
show tables;
describe 表名;

5、添加记录

//增加行
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES
( value1, value2,...valueN );

//增加列
alter table users add id serial;  //添加 id 列,类型是 serial;

//删除列
ALTER TABLE 表名  DROP i;

6、对记录增删改查:不要对数据进行 delete / update 操作,一定要加 where 语句,否则整个表的数据都会被修改。

delete from 表名 where name='shenjingwa';

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

select name,age from users;

MySQL 数据类型

数据类型-官方文档

数字类型

bit、bool/boolean、tinyint/smallint/mediumint/int/bigint、decimal、float、double、 serial (序列号,可以自增长,等价于 bigint unsigned not null auto_increment unique)

字符串类型

char(100)、 //长度为 100 字符串,长度永远不变;

varchar(100)、 //最大长度为 100 的可变字符串,长度可变;

binary(1024)、 //长度为 1024 的二进制;

varbinary(1024)、 //最大长度为 1024 的二进制,长度可变;

blob、 //长度很长的二进制;

text、 //很长的文本,一般不用于搜索;

enum('v1','v2')、 //字符串要么是 v1 ,要么是 v2;

set('v1','v2') //可以是 v1,可以是 v2,也可以是 v1 和 v2 ;

时间和日期类型

date、 //只包括年月日,不包括时间;

time、 //只包括 时分秒 等时间,没有日期;

datetime、 //日期加时间;

timestamp、 //时间戳,基于 1970年0点0分,过了多少秒;

year //只有年

JSON 类型

其它特殊类型

2、mysql 中将日期输出为 ISO 8601 格式:

SELECT DATE_FORMAT(date, '%Y-%m-%dT%TZ') AS date_formatted
FROM table_name 
ORDER BY id DESC 

ORM

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

Sequelize.js

Sequelize

可以不用写 sql 语句,用操作对象的方式来操作数据库。

yarn add sequelize
yarn add --dev @types/sequelize
yarn add mysql2

const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('数据库名','root','135790',{
    dialect:'mysql'
});

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

//初始化 user
User.init({
  username: DataTypes.STRING,
  birthday: DataTypes.DATE
}, { sequelize, modelName: 'example' });

//改变
 async function update(){
     await User.update({ id: 33 }, {
         where: {
             id: 3
         }
         });
 }
 update()

//查询
async function selectExample(){
    const users = await User.findAll();
    console.log(users.every(user => user instanceof User)); // true
    console.log("All users:", JSON.stringify(users, null, 2));
    sequelize.close()
  }
selectExample()