egg icon indicating copy to clipboard operation
egg copied to clipboard

sequelize v4 支持 ctx 的模式

Open fengmk2 opened this issue 8 years ago • 9 comments

fork 了一个版本,基于 v4 实现 ctx class 模式,方便让 sql 请求与 http ctx 上下文发生关联。

https://github.com/eggjs/sequelize/tree/v3

需要实现的功能

  • [ ] 基于 ctx 的 model => ContextModel 和 ContextSequelize,自动传递 ctx 上下文
  • [ ] ctx 在 sequelize 内部是通过 model, instance 或者 options 参数自动传递
  • [ ] 提供 beforeQueryafterQuery hooks,让日志打印可以个性化
  • [ ] mysql 使用 mysql 模块自身的 pool 实现

依赖的 PRs

  • https://github.com/eggjs/sequelize/pull/1
  • https://github.com/eggjs/egg-sequelize/pull/36

fengmk2 avatar Dec 26 '17 15:12 fengmk2

从 v4 fork ?

dead-horse avatar Dec 26 '17 15:12 dead-horse

@dead-horse 从 http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html 可以看到,目前升级到 v4 需要不少时间的。我觉得等后面产品需求没那么紧张的时候,再来看技术升级吧。

@huacnlee 也可以来评估一下。

fengmk2 avatar Dec 27 '17 01:12 fengmk2

已经尝试过,associations 部分 Context Model 实现有困难 其他地方还好

huacnlee avatar Dec 27 '17 02:12 huacnlee

@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;
});

fengmk2 avatar Dec 27 '17 14:12 fengmk2

https://github.com/eggjs/sequelize/pull/1 在这里实现

fengmk2 avatar Dec 31 '17 16:12 fengmk2

sql query 的 tracing 日志,通过 sequelize 的 beforeQueryafterQuery 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);
  }
});

fengmk2 avatar Dec 31 '17 16:12 fengmk2

应用代码不需要关注 ContextModel 的变化,都由 egg-sequelize 插件来实现和封装。 https://github.com/eggjs/egg-sequelize/pull/36

fengmk2 avatar Dec 31 '17 17:12 fengmk2

fork sequelize 后,后面的升级会不会被吐槽 🔢

atian25 avatar Jan 02 '18 01:01 atian25

sequelize 都v5了。。。

superlbr avatar Apr 14 '18 10:04 superlbr