Sequelize使用


Sequelize是什么

Sequelize是一个基于PromiseNode.js平台的ORM模块;

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

  • 对象关系映射可以把js中的类和对象与数据库中的表与数据进行关系映射;
  • js可通过类和对象操作数据库表与数据;
  • ORM可有效解决js中嵌套sql不够直观、容易出错问题;

映射关系

  • 一个js类对应一个数据库表;
  • 一个js对象对应数据库表中一条记录;
  • 一个js对象属性对应数据库表中一个字段;

Sequelize使用

使用流程

  1. 创建数据库链接对象
  2. 定义数据库表模型
  3. 将模型与数据库进行同步(即创建表)
// 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)})
  1. 通过Sequelize定义数据模型,默认会对用户传入的表名添加后缀s,如上面代码中定义表名为user_info,实际同步至数据库中表名为user_infos,可通过参数freezeTableName=true定义创建表名与代码定义保持一致;

  2. 通过Sequelize定义数据模型,会自动添加三个字段:id,createdAt、updatedAt,其中id为默认自增主键,可在模型定义外通过代码显示移除,时间相关两个字段可通过参数timestamps=false禁止自动添加;

  3. 模型同步数据库支持参数选项:

    • force:删除同名表并重建

    • alter:修改同名表结构

    • match:同步前进行正则匹配

  4. 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字段指定目标模型中用来关联的字段名

文章作者: Semon
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Semon !
评论
  目录