sequelize.js 的 Model 代码自动生成和更新

3,251 阅读3分钟

第一次在项目中使用 sequelize.js 作为数据库连接的 ORM 工具,在写第一个 Model 的过程中,冥冥之中就觉得这种东西都是固定写法,应该可以自动生成吧。幸运的是找到了一个叫做 sequelize-automate 的库,可以通过读数据库表定义,自动生成 Model 代码,简直不能再香。然而当表定义有更新需要 Model 做修改,频繁重复的执行生成命令再复制代码到项目中时,我烦了~。一顿研究,下面这个优化版诞生了~~

sequelize-automate-gm

自动生成和更新著名 ORM 框架 sequelizejs 的 Model 代码。本项目脱胎于 sequelize-automate,新增及优化内容如下:

  • 新增了 shell 交互,使用变得更简单。
  • 自动增量更新,使库表修改直接映射到 Model 对应的代码上,而你自己在 Model 内的修改不会受到影响。
  • ts Model 的生成直接将结构定义写在 Model 类内部,不再生成 *.d.ts 定义文件。
  • 修复了部分 ts 的 eslint 错误。
  • 支持 es6、commonjs 两种模块化代码。

重要提示:自动生成的 Model 仍需要经过 review 检查,避免由于工具的未知问题,对你的代码产生负面影响。

安装

全局安装

npm install -g sequelize-automate-gm

项目内安装

npm install sequelize-automate-gm

使用方式

第一步:配置文件

module.exports = {
  "dbOptions": {             // sequelize 数据库配置,该配置用于读取库配置信息
    "database": "db_test",  // 数据库名称
    "username": "guess",    // 用户
    "password": "guess",    // 密码
    "dialect": "mysql",     // 数据库方言
    "host": "localhost",    // 数据库服务地址
    "port": 3306,           // 数据库服务端口号
    "define": {
      "underscored": true,
      "freezeTableName": true,
    }
  },
  "options": {                  // 生成文件的配置信息
    "type": "js",               // 生成代码类型,支持 ts、js
    "dir": "./test/demo/model", // 生成代码文件的输出位置
    "moduleType": "commonjs",   // 生成代码的模块化方式,支持 commonjs、es6
    "sequelizeName": 'Sequelize', // Sequelize 引入Sequelize模块的变量名,默认 Sequelize
    "sequelizeModulePath": 'sequelize', // Sequelize 引入Sequelize模块的模,默认 sequelize
    "sequelizeInsName": 'sequelizeClient', // Sequelize实例的变量名,默认 sequelizeClient
    "sequelizeInsModulePath": '../lib/sequelize.js', // Sequelize实例的模块路径,无默认值,必填。
  }
}

上述配置文件中 sequelizeNamesequelizeModulePathsequelizeInsNamesequelizeInsModulePath 四个配置是为了满足有些项目对 sequelize 做了自己的封装,生成 Model 时需要按照自己的需求命名变量和指定模块路径。其中sequelizeInsModulePath为必填,是因为我已经假设你的项目一定会对 Sequelize 的实例化做了封装。

第二步:执行命令

sagm -c /path/to/config

sagm = Sequelize Automate Generate Model

运行效果

交互页面

选择生成部分表的Model还是全部表的Model

这是图片

选择要生成的表,空格check

这是图片

选择增量更新(读取已有文件,做增量更新)还是完全替换(用新生成的代码完全替换已有的)

这是图片

生成代码

// javascript
const Sequelize = require('Sequelize');

const sequelizeClient = require('../lib/sequelize.js');

const {
  DataTypes,
  Model
} = Sequelize;

class Student extends Model {}

const attributes = {
  id: {
    type: DataTypes.INTEGER,
    allowNull: false,
    defaultValue: null,
    primaryKey: true,
    autoIncrement: true,
    comment: '',
    field: 'id'
  },
  name: {
    type: DataTypes.STRING(45),
    allowNull: true,
    defaultValue: null,
    primaryKey: false,
    autoIncrement: false,
    comment: '',
    field: 'name'
  },
  age: {
    type: DataTypes.INTEGER,
    allowNull: true,
    defaultValue: null,
    primaryKey: false,
    autoIncrement: false,
    comment: '',
    field: 'age'
  },
  class: {
    type: DataTypes.STRING(45),
    allowNull: true,
    defaultValue: null,
    primaryKey: false,
    autoIncrement: false,
    comment: '',
    field: 'class'
  }
};
const options = {
  modelName: 'student',
  sequelize: sequelizeClient,
  indexes: []
};
Student.init(attributes, options);
module.exports = Student;
// typescript
const Sequelize = require('Sequelize');

const sequelizeClient = require('../lib/sequelize.js');

const {
  DataTypes,
  Model
} = Sequelize;

class Student extends Model {
  id!: number;
  name?: string;
  age?: number;
  class?: string;
}

const attributes = {
  id: {
    type: DataTypes.INTEGER,
    allowNull: false,
    defaultValue: null,
    primaryKey: true,
    autoIncrement: true,
    comment: '',
    field: 'id'
  },
  name: {
    type: DataTypes.STRING(45),
    allowNull: true,
    defaultValue: null,
    primaryKey: false,
    autoIncrement: false,
    comment: '',
    field: 'name'
  },
  age: {
    type: DataTypes.INTEGER,
    allowNull: true,
    defaultValue: null,
    primaryKey: false,
    autoIncrement: false,
    comment: '',
    field: 'age'
  },
  class: {
    type: DataTypes.STRING(45),
    allowNull: true,
    defaultValue: null,
    primaryKey: false,
    autoIncrement: false,
    comment: '',
    field: 'class'
  }
};
const options = {
  modelName: 'student',
  sequelize: sequelizeClient,
  indexes: []
};
Student.init(attributes, options);
module.exports = Student;