Sequelize 是一个基于 Promise 的 Node.js ORM,目前支持 Postgres、MySQL、SQLite 和 Microsoft SQL Server。它具有强大的事务支持,关联关系、读取和复制等功能。
所谓ORM是指对象关系映射,通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式
以下以使用mysql数据库作为案例
为了演示,首先新建文件夹初始化项目
$ mkdir sequelizeTest // 新建文件夹
$ cd sequelizeTest // 进入文件夹
$ npm init --yes // 初始化项目
1. 安装
// Using NPM
$ npm install --save sequelize
// 使用哪种数据库选择不同的安装
$ npm install --save mysql2
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server
我这里安装mysql2
2.数据库连接测试
在项目文件夹下新建一个index.js
(async function() {
const Sequelize = require('sequelize');
// 第一个参数是数据库名,第二个参数是数据库用户名,第三个参数密码
// 第四个参数配置参数 包括地址,数据库类型等
const sequelize = new Sequelize('list', 'root', '123456', {
host: 'localhost',
dialect: 'mysql'
});
// 测试是否连接函数
sequelize.authenticate()
.then(() => {
console.log('连接成功');
console.log("hello");
})
.catch(err => {
console.log(err);
})
})()
使用nodemon 作为热更新启动,这样就不用每次重启了
$ npm install nodemon -g
启动项目
$ nodemon index
显示如下,说明已成功
3.定义模型
用来表述(描述)数据库表字段信息的对象,每一个模型对象表示数据库中的一个表,后续对数据库的操作都是通过对应的模型对象来完成的
modelName:模型名称,自定义
attributes:模型中包含都数据,每一个数据映射对应表中都每一个字段
options:模型(表)的设置
attributes:字段值描述:
- type:字段类型,String|DataTypes
- allowNull:是否允许为空,默认为true
- defaultValue:默认值,默认为null
- unique:值唯一,默认为false
- primaryKey:是否为主键,默认为false
options:模型(表)的设置
- timestamps:是否给每条记录添加 createdAt 和 updatedAt 字段,并在添加新数据和更新数据的时候自动设置这两个字段的值,默认为true
- paranoid:设置 deletedAt 字段,当删除一条记录的时候,并不是真的销毁记录,而是通过该字段来标示,即保留数据,进行假删除,默认为false
- freezeTableName:禁用修改表名; 默认情况下,sequelize将自动将所有传递的模型名称(define的第一个参数)转换为复数。 默认为false
- tableName:手动设置表的实际名称
- 定义表索引 indexes:Array<Object>
每个索引对象可以设置的值
name:索引名称,默认模型名称+字段
fields: Array<string>,索引字段
unique:唯一索引,默认false
创建模型实例对象
一个模型类对应一个表,一个模型实例对象就是一条对应的表记录,通过操作这个对象来关联操作对应的表中的数据,操作模型类就是操作表,操作模型类对象就是操作该表中的某条记录 模型类 - 表 模型实例 - 记录
举例:
新建数据库list,新建一个users表 数据结构如下:
定义模型
(async function() {
const Sequelize = require('sequelize');
const sequelize = new Sequelize('list', 'root', '123456', {
host: 'localhost',
dialect: 'mysql'
});
const UsersModel = await sequelize.define('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
username: {
type: Sequelize.STRING(20),
allowNull: false
},
password: {
type: Sequelize.CHAR(32),
allowNull: false
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
}, {
tableName: 'users'
});
// UsersModel
// let user = UsersModel.build({
// username: "swnd",
// password: "q11111"
// });
// user = await user.save();
// console.log(user.get({'id': 3}));
})()
对于数据类型请参考 Sequelize - DataTypes。
4. 单表的增删改
增
方式一:调用 build 方法后对象只存在于内存中,需要进一步调用 save 方法才会保存到数据库中。
let user = UsersModel.build({
username: "swnd",
password: "q11111"
});
user = await user.save();
console.log(user.get({'id': 3}));
以上代码运行后,终端将会输出以下信息:
方式二:调用 create 方法后,会直接保存到数据库中。
const user = UsersModel.create({
username: 'zhangsan',
password: '123456'
})
console.log(user.get({'id': 6}));
改
方案一
const hasUser = await UsersModel.findOne({
where: {
id: 6,
username: 'zhangsan'
}
});
hasUser.username = 'wanggangdan'
hasUser.save();
方案二
const hasUser = await UsersModel.findOne({
where: {
id: 6
}
});
const updatedUser = await hasUser.update({
username: "green"
});
hasUser.save();
限制更新某字段
// 方案一
const hasUser = await UsersModel.findOne({
where: {
id: 6
}
});
const updatedUser = await hasUser.update({
username: "green2",
password: '8888888888'
},{
fields: ['username'] // 只允许更新这个
});
// 方案二
const hasUser = await UsersModel.findOne({
where: {
id: 6
}
});
hasUser.username = 'wanggangdan'
hasUser.passwprd = '8989878888'
hasUser.save({ fields: ['username'] }); // 只允许更新这个
删
const hasUser = await UsersModel.findOne({
where: {
id: 3
}
});
await hasUser.destroy();
如果我们启用了 paranoid
(偏执)模式,destroy
的时候不会执行 DELETE
语句,而是执行一个 UPDATE
语句将 deletedAt
字段设置为当前时间(一开始此字段值为NULL
)。不过需要注意的是,仅当 timestamps=true
为 true 时,paranoid 模式才能生效。
未完待续
本篇测试代码
(async function() {
const Sequelize = require('sequelize');
const sequelize = new Sequelize('list', 'root', '123456', {
host: 'localhost',
dialect: 'mysql'
});
const UsersModel = await sequelize.define('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
username: {
type: Sequelize.STRING(20),
allowNull: false
},
password: {
type: Sequelize.CHAR(32),
allowNull: false
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
}, {
tableName: 'users'
});
// 增
// 方式一
// let user = UsersModel.build({
// username: "swnd",
// password: "q11111"
// });
// user = await user.save();
// console.log(user.get({'id': 3}));
// 方式二
// const user = UsersModel.build({
// username: 'zhangsan2',
// password: '123456'
// })
// console.log(user.get({'id': 6}));
// 改
const hasUser = await UsersModel.findOne({
where: {
id: 3
}
});
// hasUser.username = 'wanggangdan'
// hasUser.passwprd = '8989878888'
// hasUser.save({ fields: ['username'] }); // 只允许更新这个
// const updatedUser = await hasUser.update({
// username: "green2",
// password: '8888888888'
// },{
// fields: ['username'] // 只允许更新这个
// });
await hasUser.destroy();
})()