第一次在项目中使用 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实例的模块路径,无默认值,必填。
}
}
上述配置文件中 sequelizeName
、sequelizeModulePath
、sequelizeInsName
、sequelizeInsModulePath
四个配置是为了满足有些项目对 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;
今天的文章sequelize.js 的 Model 代码自动生成和更新分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/18386.html