egg-model 插件

Created on 27 Apr 2017  ·  20Comments  ·  Source: eggjs/egg

related issues #805 https://github.com/eggjs/egg-sequelize/pull/9

需要抽象一个 egg-model 层,和现在 egg-view 的实现类似,可以支持多个 model 共存。现在交由插件直接实现 model 的加载还是不太合理:

  1. 统一 model 的编写方式,现在 egg-sequelizeegg-mongoose 的 model 写法完全不一样,一个拿到的 app 对象,一个拿到的是 mongoose 对象
  2. 支持一个项目中使用不同的 model。 #805

egg-model 支持指定默认的 model,这样如果用户只引入 sequelize 的话写法也很简单。也可以考虑通过子目录或者是文件后缀的形式来支持引入 mongoose 等其他 model 层。

- model
  - user.js
  - geographical.mongoose.js

/cc @huacnlee @denghongcai @eggjs/core

egg-sequelize discussion document

Most helpful comment

typeorm
要是有人能封装这个就好了

All 20 comments

通过增加 model 层来约束加载我觉得挺好

Q: model 的用法本身各个 ORM 实现就不同,通过什么样的访问形式来区分不同类型的model?app.model.sequelize.xxx 这样吗?

Q: 如果 ORM 也需要像 egg-mysql 插件那样支持多个数据库,怎么办?

model 的用法本身各个 ORM 实现就不同,通过什么样的访问形式来区分不同类型的model?

还是都通过 app.model.xxx 来访问吧,至于这个 xxx 是什么 model,使用者在声明这个 model 的时候就决定了,例如 xxx.mongoose.js

如果 ORM 也需要像 egg-mysql 插件那样支持多个数据库,怎么办?

这个没想清楚,但是应该是 sequelize, mongoose 这些插件来实现的。

以前有一个草案了,在那个里面讨论吧

每个插件都判断下返回的类型,比如 mongoose 判断下是否是一个 mongoose.model,sequelize 就判断下是否是 sequelize 的 model。这样对不支持的忽略就好了。

还有既然 @huacnlee 这么支持 sequelize,那就官方推荐用 sequelize 好了。#805 里提到的 mongoose session 可以直接调用 mongoose 的 client,不需要使用 model。

egg-mongoose 那个可以统一下,初始化传递 app 进去好点。

几点结论

  • ORM 推荐使用 egg-sequelize,如果想使用其他 ORM 则自己封装插件,官方不负责维护。
  • 支持混用,但不推荐。
  • ORM 都可以放在 app/model 下,但是 ORM 插件只负责符合自己逻辑的 Model,如 egg-sequelize

https://github.com/eggjs/egg/issues/388 这个可以先不讨论了,自己做成本很高。

这个要补充到文档里,应该写到哪比较好。

https://eggjs.org/zh-cn/tutorials/index.html

这里? 或者这里也要顺便改改描述

才看到这个问题……你们已经在讨论了
前段时间我也一直在想这个问题,还和天猪大哥在钉钉简单交流了下,最好做一层统一的model ORM,可以对接各种类型的数据。
我原想是在model里声明一个type,指定数据类型,然后有对应的适配器去做处理(好像和贯高在后缀表名,类似egg-view机制差不多意思)。
一些关键逻辑还在构思……这段时间赶项目,耽误住了……

我认为其实不需要额外实现一层抽象,成本略高(同时我的 JS 高级技巧欠缺,处理不好)

sequelize 已经支持很多种常见的关系型数据库,需求满足的,MongoDB
能同时支持当然更好,没支持我觉得也是可以接受的,在我看来,关系型数据库才是首要需要保障的。

纠正一下,我不是支持 Sequleize 而是支持关系型数据库的方案,只是目前 Node.js
社区可用的看起来这个略好些(其实也有很多不爽的)但以我们实际项目来看,还是能够满足需求的。

typeorm
要是有人能封装这个就好了

真这么做,再包装一下就快成loopback了,被那个坑过,千万别啊

感觉不要把关系数据库和文档数据库混一起,但是可以提供一层让两个插件可以一起使用,比如 sequelize 加载model/sequelize下的model, monggose 加载model/mongoose下的model,通过配置自己能指定加载哪个路径下的model时就可以了。

同求 TypeORM,毕竟现在全面 TypeScript,而且还能更方便的支持 GraphQL + TypeGraphQL
Sequelize 的那套不好用,话说官方的 egg-sequelize 貌似 migration 有 bug

@zhangchen91 欢迎社区直接补全,不一定要等官方的,我们自己在日常业务用不到的组件,写了也维护不好。

sequelize有个不爽的地方就是模型建立关联以后,数据库就自动加了主外键。但是不想数据库有主外键

@acodercat 用 Migration

sequelize有个不爽的地方就是模型建立关联以后,数据库就自动加了主外键。但是不想数据库有主外键

定义的时候 constraints属性设置为false;

Was this page helpful?
0 / 5 - 0 ratings

Related issues

popomore picture popomore  ·  3Comments

Ailein picture Ailein  ·  3Comments

dizhifeng picture dizhifeng  ·  3Comments

Webjiacheng picture Webjiacheng  ·  3Comments

whlsxl picture whlsxl  ·  3Comments