Sequelize

你真正了解 sequelize 吗

主键

1
{ primaryKey: true }

唯一键

1
2
{ unique: true }
{ unique: 'compositeIndex' }

自增

1
{ autoIncrement: true }

允许为空

1
{ allowNull: true }

默认值

1
2
{ defaultValue: true }
{ defaultValue: DataTypes.NOW }

属性/外键

1
2
3
4
5
personId: {
type: Sequelize.INTEGER,
references: 'persons',
referencesKey: 'id'
}
安装
1
2
npm install --save sequelize
$ npm install --save mysql2
测试连接
1
2
3
4
5
6
7
8
9
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
// 测试完注释掉即可
使用 sequelize
1
2
3
4
5
6
7
8
9
10
11
12
const sequelize = new Sequelize('db','root','123456',{
dialect:'mysql',
host:'127.0.0.1',
timezone:'+08:00', //这里是东八区,默认为0时区
//连接池 最大5个 最小0个 时间10000毫秒
pool:{
max:5,
min:0,
acquire:30000,
idle:10000,
}
})
创建数据库表(创建模型 就是字段)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const book = sequelize.define('book',{
name:{
type:DataTypes.STRING,
allowNull:false,
},
price:{
type:DataTypes.INTEGER,
},
author:DataTypes.STRING,
type:DataTypes.STRING,
},{
//关闭默认创建字段的开始时间和结束时间
timestamps:false,
})
// 更多的查看官网
https://www.sequelize.cn/core-concepts/model-basics
插入数据
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
27
28
29
30
31
async function inits(){
//将创建表,如果表已经存在,则将其首先删除(用户模型表刚刚(重新)创建) sequelize实例同步所有模型字段
await sequelize.sync({
force:true
})
//插入多条数据 单条数据create({name:'张三',price:20})
await book.bulkCreate(
[
{
name: 'Rick And Morty - The first season',
price: 30,
author: 'unkwon',
type: 'comic'
},
{
name: 'Rick And Morty',
price: 300,
author: 'unkwon',
type: 'comic'
},
{
name: 'Rick And',
price: 3000,
author: 'unkwon',
type: 'comic'
},
]
)
}

inits();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 每次连接都将把原来的表删除,然后做一次同步
sequelize.sync({
force:true,
}).then(()=> user.create({
firstName:'四哥',
lastName:'aosika'
}).then(()=>{
return user.findAll({
where:{
firstName:'四哥'
}
})
}).then(console.log)
)

express res.send()和 res.json()的区别

1
2
3
4
5
6
7
res.json()的返回结果
Response Headers 响应头中
content-Type:application/json;charset=utf-8;

res.send()
Response Headers
content-Type:text/html;charset=utf-8;
为什么使用数据库连接池
1
2
3
4
5
6
数据库连接是一种关键、有限且昂贵的资源,创建和释放数据库连接是一个很耗时的操作,频繁地进行这样的操作将占用大量的性能开销,进而导致网站的响应速度下降,严重的时候可能导致服务器崩溃;数据库连接池可以节省系统许多开销。

它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接以避免因为没有释放数据库连接而引起的数据库连接遗漏。
https://blog.csdn.net/weixin_42867975/article/details/90306610

https://www.cnblogs.com/xsilence/p/12444228.html#:~:text=%E8%AF%AD%E6%B3%95%20%EF%BC%881%EF%BC%89createConnection%E6%96%B9%E6%B3%95%E5%88%9B%E5%BB%BA%E8%BF%9E%E6%8E%A5%E5%AF%B9%E8%B1%A1%EF%BC%88%E6%AD%A3%E5%BC%8F%E7%9A%84%E8%AF%B4%E6%B3%95%EF%BC%9A%E4%BD%BF%E7%94%A8createConnection%E6%96%B9%E6%B3%95%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%A1%A8%E7%A4%BA%E4%B8%8Emysql%E6%95%B0%E6%8D%AE%E5%BA%93%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B9%8B%E9%97%B4%E8%BF%9E%E6%8E%A5%E7%9A%84connection%E5%AF%B9%E8%B1%A1%EF%BC%89%20var%20connection%20%3D%20mysql.%20createConnection%20%28options%29%3B,%EF%BC%882%EF%BC%89%E7%94%A8%E5%AF%B9%E8%B1%A1%E7%9A%84connect%E6%96%B9%E6%B3%95%E5%BB%BA%E7%AB%8B%E8%BF%9E%E6%8E%A5%E3%80%82%20connection.%20connect%20%28function%20%28err%29%20%7B%20%2A%2A%2A%20%7D%29%3B
在设计数据库时为什么有的时候需要使用外键
1
2
3
4
5
6
7
8
9
什么是外键:
外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。
外键可以保证数据的参照完整性。
如果一个健壮的系统,数据库中的数据一定有很好的参照完整性,如果不用外键,就要多写代码对数据的完整性进行额外的判断
用程序(代码)控制,有很多缺点;录入成绩单时为了保证学号有效,首先要搜索档案,当档案很大时会影响效率。程序控制并不能保证百分之百引用完整性,尤其是并发操作。
说一个特例(主要是说明程序控制不好):
A录入成绩单,B在编辑档案。
当A录入张三的成绩,保存时,搜索张三存在,于是程序下一步就要存盘,但这时B恰好把张三删除了。但A那边的程序并不知道,于是就把一条垃圾数据存进数据库中了。
此例的操作流程正确与否不重要,但说明了程序控制并不是好方法。
express 中的 req.params,req.query,req.body;
1
2
3
4
5
6
7
req.params 是获取路由的url路径参数
http:localhost:3000/test/1
req.query 是获取路由的查询参数
http:localhost:3000/test?id=1;
以上两种一般用于get请求;(params和query与前端作用相同)
req.body 一般用于post请求
req.body是用来解析post请求中的数据,前端数据发送给后端的时候,用req.body用来接收。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
router.post('/login',function(req,res){
let username=req.body.username;
let password=req.body.password;
if(username && password){
res.send({
code:200,
username:username, token:'dhuadh123hui213h,dqwdfiuejnfuiwjf,fewkio0kjfi9203kjirjf'
})
}else{
code:500,
res.send({
msg:'用户名密码错误'
})
}
})
为什么分类页面接口写 2 个响应速度最快
1
因为分类页面分为左右两部分,分为2个接口一方面是数据少响应快,第二是因为如果加了redis就更快了
为什么首页使用 redis 后每次请求数据的时间还变慢了
1
因为使用redis后第一次请求的时候是从数据库开始请求数据的,数据很多,响应的快,第二次请求的时候redis已经将数据保存在缓存中了,将大量数据都保存在缓存中,就好比一个池子一样,找到对应的一条数据响应时间边长,但是这样的好处不仅减少了数据库的压力,更大的减少了资源的浪费
token
1
2
3
4
tokend是一个令牌,用来验证哪一个用户的
作用:验证用户 比如张三 李四
token是后端生成的,并且token是不能重复的
npm install --save jsonwebtoken
使用搜索:谷歌必应百度