Open fengmk2 opened 6 years ago
从 v4 fork ?
@dead-horse 从 http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html 可以看到,目前升级到 v4 需要不少时间的。我觉得等后面产品需求没那么紧张的时候,再来看技术升级吧。
@huacnlee 也可以来评估一下。
已经尝试过,associations 部分 Context Model 实现有困难 其他地方还好
@huacnlee 鉴于今天讨论的 associations 的麻烦,后面 ctx 在 sequelize 内部是通过 options 参数自动传递,做到跟 urllib 那种效果。
开发者依旧是 ctx.model.User 方式使用,ctx 自动在内部解决,并且不需要像现在一样每次 ctx 都 hack 。
例如 ctx 里面的特殊变量 space_id,可以通过 beforeCreate(instance, options)
hook 自动设置到 instance 中。
User.hook('beforeCreate', (user, options) => {
user.space_id = user.ctx.space_id;
});
sql query 的 tracing 日志,通过 sequelize 的 beforeQuery
和 afterQuery
2 个 hooks 来实现。
sequelize.addHook('beforeQuery', (sql, options) => {
// ctx 尝试从 options.model.ctx 和 options.ctx 中获取到
const ctx = options.model && options.model.ctx || options.ctx;
if (ctx) {
ctx.logger.info('[sequelize-before-query] sql: %s', sql);
} else {
app.logger.info('[sequelize-before-query] sql: %s', sql);
}
});
sequelize.addHook('afterQuery', (sql, meta, options) => {
// ctx 尝试从 options.model.ctx 和 options.ctx 中获取到
const ctx = options.model && options.model.ctx || options.ctx;
const resultFlag = meta.error ? 'fail' : 'success';
if (ctx) {
ctx.logger.info('[sequelize-after-query] [%dms] [%s] sql: %s', meta.duration, resultFlag, sql);
} else {
app.logger.info('[sequelize-after-query] [%dms] [%s] sql: %s', meta.duration, resultFlag, sql);
}
});
应用代码不需要关注 ContextModel 的变化,都由 egg-sequelize 插件来实现和封装。 https://github.com/eggjs/egg-sequelize/pull/36
fork sequelize 后,后面的升级会不会被吐槽 🔢
sequelize 都v5了。。。
fork 了一个版本,基于 v4 实现 ctx class 模式,方便让 sql 请求与 http ctx 上下文发生关联。
https://github.com/eggjs/sequelize/tree/v3
需要实现的功能
beforeQuery
和afterQuery
hooks,让日志打印可以个性化依赖的 PRs