sequelize 数据库orm
最后更新于:2022-04-02 03:30:44
[TOC]
> [github](https://github.com/sequelize/sequelize)
## 安装
```
$ npm install --save sequelize
# 添加需要的 引擎
$ npm install --save pg pg-hstore
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # MSSQL
```
## 基础使用
```
const Sequelize = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql'|'sqlite'|'postgres'|'mssql',
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
## 应用全局的模型参数
define: {
freezeTableName: false, //取消自动表加s
charset: 'utf8',
dialectOptions: {
collate: 'utf8_general_ci'
},
timestamps: false, //不添加时间戳属性 (updatedAt, createdAt)
paranoid: true,//伪删除 ,deletedAt必须设置, 前提开启timestamps
},
});
//创建模型
const User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
});
// force: true 如果表已经存在,将会丢弃表
User.sync({force: true}).then(() => {
// 表已创建
return User.create({
firstName: 'John',
lastName: 'Hancock'
});
});
```
```
const sequelize = new Sequelize('connectionUri', {
define: {
timestamps: false // 默认为 true
}
});
```
## 模型定义
```
{
primaryKey: true, //
type: Sequelize.STRING, //DATE BOOLEAN INTEGER
allowNull: false,
someUnique: {type: Sequelize.STRING, unique: true},
autoIncrement: true
}
//自动插入时间戳
myDate: { type: Sequelize.DATE, defaultValue: Sequelize.NOW }
```
### Getters & setters
```
/* 一个用于 'title' 属性的 getter */
get() {
return this.getDataValue('title')
}
set(title) {
this.setDataValue('title', title.toString().toLowerCase());
}
````
### 验证
`create` , `update` 和 `save` 上。 你也可以调用 validate() 手动验证一个实例
```
const ValidateMe = sequelize.define('foo', {
foo: {
type: Sequelize.STRING,
validate: {
is: ["^[a-z]+$",'i'], // 只允许字母
is: /^[a-z]+$/i, // 与上一个示例相同,使用了真正的正则表达式
not: ["[a-z]",'i'], // 不允许字母
isEmail: true, // 检查邮件格式 (foo@bar.com)
isEven(value) {
if (parseInt(value) % 2 != 0) {
throw new Error('Only even values are allowed!')
// 我们也在模型的上下文中,所以如果它存在的话,
// this.otherField会得到otherField的值。
}
}
}});
```
## 增删改查
### 查
查询特定字段
```
Model.findAll({
attributes: ['foo', 'bar']
});
```
重命名
```
Model.findAll({
attributes: ['foo', ['bar', 'baz']]
});
```
聚合
```
Model.findAll({
attributes: [[sequelize.fn('COUNT', sequelize.col('hats')), 'no_hats']]
});
```
where
```
Post.findAll({
where: {
authorId: 2
}
});
Post.findAll({
where: {
[Op.or]: [{authorId: 12}, {authorId: 13}]
}
});
// SELECT * FROM post WHERE authorId = 12 OR authorId = 13;
Post.findAll({
where: {
authorId: {
[Op.or]: [12, 13]
}
}
});
```
## 更新
```
Post.update({
updatedAt: null,
}, {
where: {
deletedAt: {
[Op.ne]: null
}
}
});
```
操作符
```
const Op = Sequelize.Op
[Op.and]: {a: 5} // 且 (a = 5)
[Op.or]: [{a: 5}, {a: 6}] // (a = 5 或 a = 6)
[Op.gt]: 6, // id > 6
[Op.gte]: 6, // id >= 6
[Op.lt]: 10, // id < 10
[Op.lte]: 10, // id <= 10
[Op.ne]: 20, // id != 20
[Op.eq]: 3, // = 3
[Op.not]: true, // 不是 TRUE
[Op.between]: [6, 10], // 在 6 和 10 之间
[Op.notBetween]: [11, 15], // 不在 11 和 15 之间
[Op.in]: [1, 2], // 在 [1, 2] 之中
[Op.notIn]: [1, 2], // 不在 [1, 2] 之中
[Op.like]: '%hat', // 包含 '%hat'
[Op.notLike]: '%hat' // 不包含 '%hat'
[Op.iLike]: '%hat' // 包含 '%hat' (不区分大小写) (仅限 PG)
[Op.notILike]: '%hat' // 不包含 '%hat' (仅限 PG)
[Op.regexp]: '^[h|a|t]' // 匹配正则表达式/~ '^[h|a|t]' (仅限 MySQL/PG)
[Op.notRegexp]: '^[h|a|t]' // 不匹配正则表达式/!~ '^[h|a|t]' (仅限 MySQL/PG)
[Op.iRegexp]: '^[h|a|t]' // ~* '^[h|a|t]' (仅限 PG)
[Op.notIRegexp]: '^[h|a|t]' // !~* '^[h|a|t]' (仅限 PG)
[Op.like]: { [Op.any]: ['cat', 'hat']} // 包含任何数组['cat', 'hat'] - 同样适用于 iLike 和 notLike
[Op.overlap]: [1, 2] // && [1, 2] (PG数组重叠运算符)
[Op.contains]: [1, 2] // @> [1, 2] (PG数组包含运算符)
[Op.contained]: [1, 2] // <@ [1, 2] (PG数组包含于运算符)
[Op.any]: [2,3] // 任何数组[2, 3]::INTEGER (仅限PG)
```
## 分页 / 限制
```
// 获取10个实例/行
Project.findAll({ limit: 10 })
// 跳过8个实例/行
Project.findAll({ offset: 8 })
// 跳过5个实例,然后取5个
Project.findAll({ offset: 5, limit: 5 })
```
## 一对一关联
```
const Player = this.sequelize.define('player', {/* attributes */});
const Team = this.sequelize.define('team', {/* attributes */});
Player.belongsTo(Team); // 将向 Player 添加一个 teamId 属性以保存 Team 的主键值
```
';