Egg: 使用egg-sequelize的时候,如何写model和migrate?

Created on 17 Oct 2017  ·  20Comments  ·  Source: eggjs/egg

按目前文档的意思,建立一个数据库表的过程应该是:

  1. 先写model
  2. 用命令npm run migrate:new来创建一个migrate文件
  3. 在migrate文件里写migrate的逻辑

migrate里创建表的代码和model里的定义代码是一样的,岂不是repeat yourself了么。

但是这几步,用sequelizemodel:generate命令是一步生成出来的,你们为什么不也用生成的方式做呢?为什么推荐手写?是觉得生成的代码不好么?

PR is welcome help wanted egg-sequelize

Most helpful comment

@IndexXuan
其实我找了一圈目前还没有找到哪个库的ORM migrate这块做的好的。。。
Java ORM我不太清楚,Python后台(django)开发的时候,体验是这样的:先把model的class写好或者改好,然后执行make migrate命令, 这时候migrate脚本就根据model生成好了,然后执行run migrate, 就把数据库migrate了。所以开发的时候实际上不需要去管DB这块的(除非你有特别的需求)

但是目前来看,基本所有的Node ORM对migrate支持都不好,或多或少都需要自己去写或者改migrate文件。

不过node目前可能主要用于proxy服务器(BFF mentioned by @popomore), 所以ORM这种和业务逻辑关联比较大的内容目前还没有发展好。毕竟正式项目中用node去完全写业务后台的可能还不多,异步编程实在比同步编程烦多了。。。。。不过随着async/await的引入和成熟,Node这方面的劣势得到了缓解,说不定未来Node业务server也能慢慢流行起来。(Node后台我认识不深,除了异步编程复杂度方面,不太清楚还有没有其他劣势,如果说的不对请见谅)

其他的框架,我看过think.js,好像是360出品,文档我楞是没看懂。。。后来就放弃了。

另外,egg.js文档上的function * 是不是是时候全改成async/await了。。。

All 20 comments

你可以开发一个工具,这些都需要社区来支持

所以阿里就是这样repeat yourself的设计和使用的么?我只是觉得比较奇怪,大神不可能想不到啊。还是说你们觉得这样没有问题?

用 sequelize 不是很多

@popomore 所以你们在用的时候都是手写SQL, 而不是用ORM的?或者是node server大多作为proxy层,数据库的操作主要是在业务服务(java, python server)上去做的?如果是这样的话,我就能理解了

主要业务还是 java 操作数据的,node 只要是 BFF 支持多端。不过现在也有全栈的系统了,sequelize 也是开源后才采用的,和大家的起跑线差不多。

@njleonzhang 我们更多的场景是 Java 提供 RPC 接口,或者是类似 firebase 这种 BaaS 系统提供接口。

自动生成这块,属于脚手架的范畴了,

egg-sequelize 之前是简单提供了一个 mirgrate,但没有做完整,这块有兴趣的话,欢迎给我们提 PR 来实现。

@atian25 谢谢解释,不管谁做,都希望这块能尽快完善起来。egg的文档还不错,希望越来越好。

@njleonzhang 我们更期望社区参与进来一起完善,我们用的不多的,优先级会低一些。

或者你先提一个 RFC 提案? 参考 https://github.com/orgs/eggjs/projects/1 之前的那个 RFC 提案的写法

创建 migrate 来定义数据库表结构主要是多人开发同步数据库结构用的,具体你可以参考一下 Ruby on Rails 的 migrate 流程参考一下。

反正这几天在选型,先看到 egg-mysql,又看到 egg-sequelize,感觉确实像楼主说的,重复写 app/model 和 migrate 里的代码 ... 还有其他问题,准备先放弃,先用 egg-mysql 了 ... 希望 egg 越来越好

@IndexXuan
其实我找了一圈目前还没有找到哪个库的ORM migrate这块做的好的。。。
Java ORM我不太清楚,Python后台(django)开发的时候,体验是这样的:先把model的class写好或者改好,然后执行make migrate命令, 这时候migrate脚本就根据model生成好了,然后执行run migrate, 就把数据库migrate了。所以开发的时候实际上不需要去管DB这块的(除非你有特别的需求)

但是目前来看,基本所有的Node ORM对migrate支持都不好,或多或少都需要自己去写或者改migrate文件。

不过node目前可能主要用于proxy服务器(BFF mentioned by @popomore), 所以ORM这种和业务逻辑关联比较大的内容目前还没有发展好。毕竟正式项目中用node去完全写业务后台的可能还不多,异步编程实在比同步编程烦多了。。。。。不过随着async/await的引入和成熟,Node这方面的劣势得到了缓解,说不定未来Node业务server也能慢慢流行起来。(Node后台我认识不深,除了异步编程复杂度方面,不太清楚还有没有其他劣势,如果说的不对请见谅)

其他的框架,我看过think.js,好像是360出品,文档我楞是没看懂。。。后来就放弃了。

另外,egg.js文档上的function * 是不是是时候全改成async/await了。。。

你再看看官网,上周都改完了。

发自我的 iPhone

在 2017年12月5日,16:16,Leon Zhang notifications@github.com 写道:

@IndexXuan
其实我找了一圈目前还没有找到哪个库的ORM migrate这块做的好的。。。�
Java ORM我不太清楚,Python后台(django)开发的时候,体验是这样的:先把model的class写好或者改好,然后执行make migrate命令, 这时候migrate脚本就根据model生成好了,然后执行run migrate, 就把数据库migrate了。所以开发的时候实际上不需要去管DB这块的(除非你有特别的需求)

但是目前来看,基本所有的Node ORM对migrate支持都不好,或多或少都需要自己去写或者改migrate文件。

不过node目前可能主要用于proxy服务器(BFF mentioned by @popomore), 所以ORM这种和业务逻辑关联比较大的内容目前还没有发展好。毕竟正式项目中用node去完全写业务后台的可能还不多,异步编程实在比同步编程烦多了。。。。。不过随着async/await的引入和成熟,Node这方面的劣势得到了缓解,说不定未来Node业务server也能慢慢流行起来。(Node后台我认识不深,除了异步编程复杂度方面,不太清楚还有没有其他劣势,如果说的不对请见谅)

其他的框架,我看过think.js,好像是360出品,文档我楞是没看懂。。。

另外,egg.js文档上的function * 是不是是时候全改成async/await了。。。


You are receiving this because you modified the open/close state.
Reply to this email directly, view it on GitHub, or mute the thread.

@atian25 sorry, 之前看还没改,今天临时回复,没有注意,不好意思。

我山寨了一个 Ruby on Rails 的 Active Record 叫 Leoric。目前主要实现了查询、关联关系这些,migration 一直不是我在写 model 时的痛点,所以也就忽略了。

现在有方案了么?

我也觉得这设计真的。。

可以去 sequelize 社区提需求,但是个人觉得 model 和 migration 分开更合适,手写一遍更利于梳理数据结构的变更。而且一般来说 migration 只用于管理本地和测试用的数据库,生产环境的数据库甚至要再手写一遍 sql 或者在 db 控制台录入一遍的。

利用Model.getTableName() 和 Model.rawAttributes来解决这个问题
具体的方法看下面这个例子,我已经测试过了

'use strict';
const mock = require('egg-mock');
module.exports = {
  up: queryInterface => {
    return (async () => {
      const app = mock.app();
      await app.ready();
      return await queryInterface.createTable(app.model.Robot.getTableName(), app.model.Robot.rawAttributes);
    })();
  },

  down: queryInterface => {
    return (async () => {
      const app = mock.app();
      await app.ready();
      return await queryInterface.dropTable(app.model.Robot.getTableName());
    })();
  },
};

@njleonzhang @popomore

利用Model.getTableName() 和 Model.rawAttributes来解决这个问题
具体的方法看下面这个例子,我已经测试过了

'use strict';
const mock = require('egg-mock');
module.exports = {
  up: queryInterface => {
    return (async () => {
      const app = mock.app();
      await app.ready();
      return await queryInterface.createTable(app.model.Robot.getTableName(), app.model.Robot.rawAttributes);
    })();
  },

  down: queryInterface => {
    return (async () => {
      const app = mock.app();
      await app.ready();
      return await queryInterface.dropTable(app.model.Robot.getTableName());
    })();
  },
};

@njleonzhang @popomore

如果能把model下的模型自动migrate就更好了

可以去 sequelize 社区提需求,但是个人觉得 model 和 migration 分开更合适,手写一遍更利于梳理数据结构的变更。而且一般来说 migration 只用于管理本地和测试用的数据库,生产环境的数据库甚至要再手写一遍 sql 或者在 db 控制台录入一遍的。

最近再做框架迁移(strapi->featherjs),数据库的字段也要跟着有些改动,这个过程中感觉sequelize如果能自动的同步migration的话,会方便很多

Was this page helpful?
0 / 5 - 0 ratings