Sequelize是什么
Sequelize
是一个基于Promise
的Node.js
平台的ORM
模块;
ORM(Object-Relational-Mapping)
即对象关系映射:
- 对象关系映射可以把
js
中的类和对象与数据库中的表与数据进行关系映射; js
可通过类和对象操作数据库表与数据;ORM
可有效解决js
中嵌套sql
不够直观、容易出错问题;
映射关系
- 一个
js
类对应一个数据库表; - 一个
js
对象对应数据库表中一条记录; - 一个
js
对象属性对应数据库表中一个字段;
Sequelize使用
使用流程
- 创建数据库链接对象
- 定义数据库表模型
- 将模型与数据库进行同步(即创建表)
// 1. 创建链接
const { Sequelize } = require('sequelize')
const { MYSQL_USER, MYSQL_PASSWD, MYSQL_PORT, MYSQL_HOST, MYSQL_DB } = require('../conf/config')
const conn = new Sequelize(MYSQL_DB,MYSQL_USER,MYSQL_PASSWD, {
dialect: 'mysql',
host: MYSQL_HOST,
port: MYSQL_PORT,
//定义连接池
pool: {
max: 5,
idle: 30000,
acquire: 60000
},
//定义数据库字符集
charset: 'utf8'
})
conn.authenticate().then(() =>{console.log(`connect to ${MYSQL_HOST}'s DB success`)}).catch((err) => {console.log( err +`connect to ${MYSQL_HOST}'s DB failed`)})
module.exports = conn
//2. 定义模型
const sequelize = require('sequelize')
const conn = require('../dao/conn.mysql')
const UserModel = conn.define('user_info',{
username: {
type: sequelize.STRING,
allowNull: false,
unique: true
},
password: {
type: sequelize.STRING,
allowNull: false,
unique: false
},
is_admin: {
type: sequelize.BOOLEAN,
allowNull: false,
defaultValue: false
}
},
{
freezeTableName: true,
timestamps: false
}
);
UserModel.removeAttribute("id");
module.exports = UserModel
//3. 同步数据库
const res = UserModel.sync({force:true,match: /_info$/}).then(() => {console.log('UserModel sync success')}).catch( (err) => {console.log('UserModel sync failed:' + err)})
通过
Sequelize
定义数据模型,默认会对用户传入的表名添加后缀s
,如上面代码中定义表名为user_info
,实际同步至数据库中表名为user_infos
,可通过参数freezeTableName=true
定义创建表名与代码定义保持一致;通过Sequelize定义数据模型,会自动添加三个字段:
id,createdAt、updatedAt
,其中id
为默认自增主键,可在模型定义外通过代码显示移除,时间相关两个字段可通过参数timestamps=false
禁止自动添加;模型同步数据库支持参数选项:
force
:删除同名表并重建
alter
:修改同名表结构
match
:同步前进行正则匹配
Sequelize
支持用户通过数据库创建表,使用js
定义模型完成数据库表与模型关联;(即不执行第三步)
模型关联
Sequelize
模型关联存在两个概念:
- 源模型:关系词前方为源模型
- 目标模型:关系词后方为目标模型
模型关联主要存在四种关系:hasOne、belongsTo、hasMany、belongsToMany
hasOne
:一对一关系,默认会向目标模型创建一个外键,也可自行指定一个目标模型中已存在外键字段,默认使用源模型主键与目标模型外键字段关联,如关联字段非源模型主键,则需同时声明源模型中用于关联的字段名:{foreignKey:'xxx',sourceKey:'xxx'}
belongsTo
:一对一关系,默认会向源模型创建一个外键,也可自行指定一个源模型中已存在外键字段,,默认使用源模型外键与目标模型主键字段关联,如关联字段非目标模型主键,但需同时声明目标模型中用于关联的字段名:{foreignKey:'xxx',targetKey:'xxx'}
hasMany
:一对多关系,默认会向目标模型添加一个字段,一般为源模型名+id
belongsToMany
:多对多关系,多对多关系需使用through
模型来实现关联;
const StuModel = conn.define(
"student",
{
class_id: {
type: sequelize.STRING,
},
stu_name: {
type: sequelize.STRING,
},
},
{
freezeTableName: true,
timestamps: false,
}
);
const ClsModel = conn.define(
"class",
{
class_id: {
type: sequelize.STRING,
primaryKey: true,
},
class_name: {
type: sequelize.STRING,
},
},
{
freezeTableName: true,
timestamps: false,
}
);
StuModel.belongsTo(ClsModel); // 默认会为StuModel创建一个外键clsmodelId,用来与ClsModel的主键进行关联
StuModel.belongsTo(ClsModel, { foreignKey: 'class_id', targetKey: 'class_id'}); //如ClsModel未指定主键,则需添加targetKey字段指定目标模型中用来关联的字段名
ClsModel.hasOne(StuModel); // 默认会为StuModel创建一个外键clsmodelId,用来与ClsModel的主键进行关联
ClsModel.hasOne(StuModel, { foreignKey: 'class_id', sourceKey: 'class_id'}); //如ClsModel未指定主键,则需添加sourceKey字段指定目标模型中用来关联的字段名