eggjs / egg

🥚 Born to build better enterprise frameworks and apps with Node.js & Koa
https://eggjs.org
MIT License
18.88k stars 1.81k forks source link

sequelize v4 支持 ctx 的模式 #1885

Open fengmk2 opened 6 years ago

fengmk2 commented 6 years ago

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

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

需要实现的功能

依赖的 PRs

dead-horse commented 6 years ago

从 v4 fork ?

fengmk2 commented 6 years ago

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

@huacnlee 也可以来评估一下。

huacnlee commented 6 years ago

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

fengmk2 commented 6 years ago

@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 commented 6 years ago

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

fengmk2 commented 6 years ago

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 commented 6 years ago

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

atian25 commented 6 years ago

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

superlbr commented 6 years ago

sequelize 都v5了。。。