目录
Mysql
安装
网上教程非常多不赘述。
sql语句基础
show DATABASES;-- 查询所有数据库
CREATE DATABASE blog_learn; -- 创建数据库
-- 使用数据库
USE blog_learn;
-- 查询表
SELECT * FROM users;
SELECT * FROM blogs;
-- 查询表中项
SELECT username, nickname FROM users;
-- 数据条件查找表中项
SELECT username,nickname from users WHERE username='wuwuwu'AND `password`=654321;
-- 降序查询表中项
SELECT * FROM blogs ORDER BY id DESC;
-- 查询数据总数
SELECT COUNT(id) AS 'count' FROM blogs;
-- 降序,限制2行数,跳过2行查询数据
SELECT * FROM blogs ORDER BY id DESC LIMIT 2 OFFSET 2;
-- 连表查询(最好有外键的前提下,两表之间一起查询)不一定要有外键
SELECT * FROM blogs INNER JOIN users ON users.id=blogs.userid;
SELECT blogs.*,users.username,users.nickname
FROM blogs INNER JOIN users ON users.id=blogs.userid WHERE users.nickname='走走走';
-- 创建表
CREATE TABLE `blog_learn`.`无标题` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` text NOT NULL,
`userid` int(0) NOT NULL COMMENT '对应users表',
PRIMARY KEY (`id`)
);
-- 增加数据
INSERT INTO users(username,`password`,nickname)VALUES('zouzouzou',123456,'走走走');
INSERT INTO blogs(title,content,userid)VALUES('标题2','内容',2);
-- 更新数据
UPDATE blogs SET content='内容1内容1' WHERE id=1;
-- 删除数据
DELETE FROM blogs WHERE id=4;
外键
外键的作用是保持数据一致性、完整性,主要体现在下面两个方面:
阻止执行
从表插入新行,其外键值不是主表的主键值便阻止插入;
从表修改外键值,新值不是主表的主键值便阻止修改;
主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行
主表删除行,连带从表的相关行一起删除;
主表修改主键值,连带从表相关行的外键值一起修改。
添加userid(blog)->id(users)外键实例代码:
ALTER TABLE `blog_learn`.`blogs`
ADD CONSTRAINT `usersid` FOREIGN KEY (`userid`) REFERENCES `blog_learn`.`users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Esquelize
安装
- 在项目根目录下若无配置文件,先安装:npm init -y
- 安装mysql2、sequelize的包:npm i mysql2 sequelize -d
测试连接
1.创建seq.js
const Sequlize = require('sequelize')//引入包
//创建连接
const conf = {
host: 'localhost',
dialect:'mysql'
}
const seq = new Sequlize('blog_learn','root','zjl199761',conf)//数据库名,权限,密码
//测试连接,终端执行node src/seq.js测试
seq.authenticate().then(() => {
console.log('ok')
}).catch(() => {
console.log('err')
})
// module.exports = seq//输出实例
- 终端执行:node src/seq.js测试
创建模型(表)
- 新建model.js,例新建User模型表
const Sequelize = require('sequelize')
const seq = require('./seq')//导入创建连接的包
//创建User模型,数据表的名字是users
const User = seq.define('user',{
//id会自动创建,并设为主键
userName: {
type: Sequelize.STRING,//varvhar:255
allowNull:false
},
password: {
type:Sequelize.STRING,
allowNull:false
},
nickName:{
type: Sequelize.STRING,
comment:'昵称'//注释
}
//自动创建:createAt和updatedAt
})
module.exports ={
User
}
- 外键关联
//外键关联
//两者区别在于谁在前面,通过谁去查谁
Blog.belongsTo(User,{
//创建外键 Blog.userId -> User.Id
foreignKey:'useId'
})
User.hasMany(Blog,{
//创建外键 Blog.userId -> User.Id
foreignKey:'useId'
})
数据同步(sync)
- 在sync.js下
const seq = require('./seq')
require('./model')
//测试连接
seq.authenticate().then(() => {
console.log('auto ok')
}).catch(() => {
console.log('auto err')
})
//执行同步
//force:若数据库中有也强行创建
seq.sync({ force: true }).then(() =>{
console.log("sync ok")
process.exit()//退出
})
2.终端执行:node src/sync.js;在mysql中同步数据
插入数据
- 在create.js中(create方法,dataValues方法)
const {Blog, User} = require('./model')
//!()()上面程序中断不影响里面代码执行
!(async function () {
//创建用户行
const zouzouzou = await User.create({
userName:'zouzouzou',
password:'123456',
nickName:'走走走'
})
console.log('zouzouzou',zouzouzou.dataValues)
const zouzouzouId = zouzouzou.dataValues.id
const blog22 = await Blog.create({
title:'标题22',
content:'内容22',
userId:zouzouzouId
})
})()
查询数据
const {Blog, User} = require('./model')
!(async function () {
//查询一条记录FindOne
const zouzouzou = await User.findOne({
where:{
userName:'zouzouzou'
}
})
console.log('zouzouzou',zouzouzou.dataValues)
//查询特定的列,添加属性attributes如:['userName','nickName'],
const zouName = await User.findOne({
attributes:['userName','nickName'],
where:{
userName:'zouzouzou'
}
})
console.log('zouName',zouName.dataValues)
//查询一个列表findAll
const zouBlogList = await Blog.findAll({
where:{
userId:1
},
order:[
['id','desc']
]
})
console.log(
'zouList',//map处理数据,回调函数返回其中的值
zouBlogList.map(blog => blog.dataValues)
)
//分页查询:限制查询
const blogPageList = await Blog.findAll({
limit:2,//限制查询两行
offset:0,//跳过多少条
order:[
['id','desc']//降序
]
})
console.log(
'blogPageList',
blogPageList.map(blog=>blog.dataValues)
)
//查询总数findAndCountAll
const blogListAndCount = await Blog.findAndCountAll({
limit:2,//限制查询两行
offset:0,//跳过多少条
order:[
['id','desc']//降序
]
})
console.log(
'blogListAndCount',
blogListAndCount.count,//所有总数。不考虑分页
blogListAndCount.rows.map(blog=>blog.dataValues)//.row返回数组
)
//连表查询依赖Blog.belongsTo(User
const blogListWithUser = await Blog.findAndCountAll({
order:[
['id','desc']
],
include:[//包含
{
model:User,//在User表中查
attributes:['userName','nickName'],
where:{
userName:'zouzouzou'
}
}
]
})
console.log(
'blogListWithUser',
blogListWithUser.count,
blogListWithUser.rows.map(
blog =>{
const blogVal = blog.dataValues
blogVal.user = blogVal.user.dataValues//1对多关系所有用user
return blogVal
}
)
)
//连表查询依赖User.hasMany(Blog,{
const UserListWithBlog = await User.findAndCountAll({
attributes:['userName','nickName'],
include:[
{
model:Blog
}
]
})
console.log(
'userListWithBlog',
UserListWithBlog.count,
//JSON.stringify强制转化JSON
JSON.stringify(UserListWithBlog.rows.map(user=>{
const userVal = user.dataValues
userVal.blogs=userVal.blogs.map(blog=>blog.dataValues)//1对多关系所有用blogs
return userVal
}))
)
})()
更新数据
Update.js
const { User} = require('./model')
//更新zouzouzou的昵称nickname
!(async function () {
const updateRes = await User.update({//两个参数
nickName:'走走走1'
},{
where:{
userName:'zouzouzou'
}
})
console.log('Update',updateRes[0]>0)
})()
删除数据
const { User,Blog} = require('./model')
!(async function () {
//删除一条博客
const delBlogRes = await Blog.destroy({
where:{
id:4
}
})
console.log('delBlogRes',delBlogRes>0)
//删除一个用户,若有外键在mysql中外键设计要Do Delete:cascade
const delUserRes = await User.destroy({
where:{
id:1
}
})
console.log('delUserRes',delUserRes>0)
})()
连接池
在seq.js中
//线上环境,使用连接池
conf.pool = {
max:5,//连接池中最大的连接数量
min:0,//最小
idle:10000//如果一个连接池10S之内没有被使用,则释放
}