可能这个疑惑只在像我这种从mongoose
要切换到sequelize
的人身上出现。
先上官方文档推荐的方法:
const {Sequelize, Model} = require('sequelize');
const sequelize = require('../../base/db');
class User extends Model {
// 静态方法 相当于mongoose schema.statics上定义的方法
static method() {
return 'statics function';
};
// 实例方法 相当于mongoose schema.methods上定义的方法
method() {
return 'methods function';
}
}
User.init({
id: {
type: Sequelize.INTEGER(11),
primaryKey: true,
autoIncrement: true,
},
name: {
type: Sequelize.STRING,
},
}, {sequelize, tableName: 'users'});
最近有个项目要升级,并且数据库要从mongodb
迁移到mysql
,于是要学习使用sequelize,准备替换原来的mongose。
之前在node
都是用mongose
,习惯了用schema.methods
定义实例方法,用schema.statics
来定义静态方法。
因为项目模型比较多,为了更容易维护,还把不同的方法分文件独立维护
mongoose
项目模型index.js
写法
const mongoose = require('mongoose');
const schema = require('./schema');
const methods = require('./methods');
const statics = require('./statics');
const User = new mongoose.Schema(schema);
for (const attr in methods) {
User.methods[attr] = methods[attr];
}
for (const attr in statics) {
User.statics[attr] = statics[attr];
}
module.exports = mongoose.model('users', User);
sequelize
把方法定义在class
上面,我如果想像原来那样单文件维护呢?
考虑了一下,有两个方案。
1、每个文件写class
逐级继承
// statics.js
class UserStatics extends Model {
// 静态方法
static method() {
};
}
// methods.js
class UserMethods extends UserStatics {
// 实例方法
method() {
};
}
// index.js
class User extends UserMethods {
}
如果采用这个方案我原项目要升级难度就大了,等于每个文件全部要重写。
2、直接为class(函数)添加方法
又想了下,其实ES6 class
只是构造函数的语法糖而已
class User {
static method() {
return 'statics function';
}
method() {
return 'methods function';
}
}
等于
function User() {
}
User.method = function () {
return 'statics function';
};
User.prototype.method = function () {
return 'methods function';
};
想通这点改写起来就简单了,我很快把index.js
写出来
sequelize
项目模型index.js
写法
const {Model} = require('sequelize');
const sequelize = require('../../base/db');
const schema = require('./schema');
const methods = require('./methods');
const statics = require('./statics');
class User extends Model {
}
for (const attr in methods) {
User.prototype[attr] = methods[attr];
}
for (const attr in statics) {
User[attr] = statics[attr];
}
User.init(schema, {sequelize, tableName: 'users'});
module.exports = User;
这样就直接兼容我原来的文件结构了,剩下的就是语法及逻辑的切换调整