按目前文档的意思,建立一个数据库表的过程应该是:
npm run migrate:new来创建一个migrate文件migrate里创建表的代码和model里的定义代码是一样的,岂不是repeat yourself了么。
但是这几步,用sequelize的model:generate命令是一步生成出来的,你们为什么不也用生成的方式做呢?为什么推荐手写?是觉得生成的代码不好么?
你可以开发一个工具,这些都需要社区来支持
所以阿里就是这样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的话,会方便很多
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了。。。