2-7、sequelize 创建连接数据库

(1)sequelize 介绍

  • ORM - Object Relational Mapping (对象关系映射)

(2)使用 sequelize 创建数据库模型方法

  • 数据库,用 JS 中的模型(class或对象) 代替
  • 一条或多条记录,用 JS 中一个对象或数组代替
  • sql 语句,用对象方法代替

(3)代码演示

  • 环境配置
    在这里插入图片描述
  • 代码演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* seq.js */
const Sequelize = require('sequelize')

const conf = {
host:'localhost',
dialect:'mysql'
}

const seq = new Sequelize('koa2-weibo_db', 'root', '123456',conf)

//测试连接
seq.authenticate().then(() => {
console.log('ok')
}).catch(() => {
console.log('err')
})
// module.exports = seq

2-8、sequelize 创建数据模型及关联外键

在这里插入图片描述

2-9、sequelize 插入数据

1
2
3
4
5
6
7
8
9
10
11
const { User, Blog} = require('./model')

!(async function demo () {
//创建用户
const zhangsan = await User.create({
userName:'zhangsan',
password:'123',
nickName:'张三'
})
console.log('zhangsan',zhangsan.dataValues)
})()

2-10、sequelize 查询数据

  • 查询一条记录
1
2
3
4
5
6
7
8
9
const { User} = require('./model')
!(async function () {
const zhangsan = await User.findOne({
where: {
userName: 'zhangsan'
}
})
console.log(zhangsan.dataValues)
})()
  • 查询特定的列
1
2
3
4
5
6
7
8
9
10
const { User} = require('./model')
const zhangsanName = await User.findOne({
attributes: ['userName', 'nickName'],
where: {
userName: 'zhangsan'
}
})
console.log(zhangsanName.dataValues)
})()

  • 查询一个列表
1
2
3
4
5
6
7
8
9
10
11
12
13
const { Blog} = require('./model')
!(async function () {
const zhangsanBlogList = await Blog.findAll({
where:{
userId:1
},
order:[
["id","desc"]
]
})
console.log(zhangsanBlogList.map(blog => blog.dataValues))
})()

  • 数据分页
1
2
3
4
5
6
7
8
9
10
11
const { Blog} = require('./model')
!(async function () {
const blogPageList = await Blog.findAll({
limit:2,//一页多少个数据
offset:0,//跳过多少个数据
order:[
['id','desc']
]
})
console.log(blogPageList.map(blog => blog.dataValues))
})()
  • 查询总数和数据分页
1
2
3
4
5
6
7
8
9
10
11
const { Blog} = require('./model')
!(async function () {
const blogListAndCount = await Blog.findAndCountAll({
limit:2,
offset:0,
order:[
["id", "desc"]
]
})
console.log(blogListAndCount.count,blogListAndCount.rows.map(blog => blog.dataValues))
})()

2-11、sequelize 连表查询

  • 连表查询1 查询zhangsan博客(主)连带查询用户信息(次)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
      //连表查询1 查询zhangsan博客(主)连带查询用户信息(次)
    const blogListWithUser = await Blog.findAndCountAll({
    order:[
    ["id","desc"]
    ],
    include:[
    {
    model:User,//次表
    attributes:['userName','nickName'],
    where: {
    userName :'zhangsan'
    }
    },
    ],
    })
    console.log(blogListWithUser.count)
    console.log(
    blogListWithUser.rows.map(blog => {
    //取出全部数据
    const blogVal = blog.dataValues
    //数据格式优化
    blogVal.user = blogVal.user.dataValues
    return blogVal;
    })
    )
    })()
    在这里插入图片描述
    代码讲解
    在这里插入图片描述

  • 连表查询2 查询zhangsan用户信息(主)连带查询博客(次)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const userListWithBlog = await User.findAndCountAll({
attributes:['username','nickName'],
include:[
{
model:Blog
}
]
})
console.log(userListWithBlog.count)
console.log(
userListWithBlog.rows.map(user => {
const userVal = user.dataValues
userVal.blogs =userVal.blogs.map(blog => blog.dataValues)
return userVal
})
)

在这里插入图片描述
代码讲解
在这里插入图片描述
另外:如果控制台想查看输出的博客信息可以进行以下修改
在这里插入图片描述

2-12、sequelize 更新与删除操作

  • 更新操作
1
2
3
4
5
6
7
8
9
10
11
12
13
const {User} = require('./model')

!(async function () {
const updateRes = await User.update({
nickName:'张三'
},
{
where: {
userName:'zhangsan'
}
})
console.log('updateRes...',updateRes[0] > 0)
})()
  • 删除操作
1
2
3
4
5
6
7
8
9
10
const {Blog} = require('./model')

!(async function ()){
const delBlogRes = await Blog.destroy({
where:{
id:4
}
})
console.log('delBlogRes',delBlogRes>1)
}

2-13、sequelize 配置连接池(线上环境下)

在这里插入图片描述