Modelar 2.0 发布,支持 6 大数据库!
发布于 7 年前 作者 Hyurl 3922 次浏览 来自 分享

经过挺长时间的酝酿,Modelar 今天终于迎来了 2.0 版本,新版本支持了包括 MySQL/MariaDBPostgreSQLMicroSoft SQL ServerOracleDBDB2SQLite 在内的 6 大数据库类型。

Modelar 是使用纯 JavaScript 语言编写的专业级 ORM 模型,和 TypeORM 不同,你不必为了使用 Modelar 而去学习 TypeScript。 Modelar 拥有查询语句建构器表建构器模型包装器等众多特性,运用它们,你可以很快编写出漂亮又高效的应用程序。

同时,Modelar 具有跨数据库一致性,也就是意味着同一份代码,你可以使用在任何它所支持的数据库上,而不用去担心不同的数据库会有不同的反应。 你不需要担心 Mssql、Oralce 和 DB2 不支持 LIMIT 语句而不能够使用 query.limit() 方法,也不用担心要实现分页需要多大的负担,这一切,Modelar 都帮你预先准备好了。

更多详细内容,请查看 https://github.com/Hyurl/modelar 或者直接访问文档网站 http://modelar.hyurl.com

15 回复

一般来说看到数据库相关的包,会很关心UT覆盖够不够,要不考虑补一下?

@aojiaotage 引 “经常有人问我这样的问题:“我们在做单元测试,那测试覆盖率要到多少才行?”。而我的答案很简单,‘作为指标的测试覆盖率都是没有用处的。’”

@Hyurl 话虽如此 但没有 谁敢在公司项目上采用?

另外想知道如何让mysql实现支持sequence相关操作的?

@waitingsong modelar 测试过很多东西,不是什么资料都对外公布并说得一清二楚的,你要想知道具体实现,看源码,特别是适配器的源码

能说下,对此其他ORM的特点,以及优势在哪里。

比如查询或者创建,每次都要new一个model实例。然后里面重复定义了类型。势必会对内存增加负担

来自酷炫的 CNodeMD

@axetroy 我自己觉得最大的优势就是跨数据库一致性,这样保证了同一份代码,可以运行在不同数据库上,其他 orm 基本上没有这种能力。还有它简洁易用,不像 typeorm 你还要专门去学习 typescript 语言。至于实例化,这主要是为了增加可读性和语义化,大多数 orm 都追求这一点并采用相同方案。至于内存负担,代码写得好,本身就是一种优化。

knexjs 就不错,不知道你的怎样

@Hyurl 现在的ORM都是这样,跨数据库的一致性。除了一些数据库不支持的特性/类型之外

在模型定义方面,比如sequelize是这么定义的

const Pub = Sequelize.define('pub', {
  name: { type: Sequelize.STRING },
  address: { type: Sequelize.STRING },
  latitude: {
    type: Sequelize.INTEGER,
    allowNull: true,
    defaultValue: null,
    validate: { min: -90, max: 90 }
  },
  longitude: {
    type: Sequelize.INTEGER,
    allowNull: true,
    defaultValue: null,
    validate: { min: -180, max: 180 }
  },
}, {
  validate: {
    bothCoordsOrNone() {
      if ((this.latitude === null) !== (this.longitude === null)) {
        throw new Error('Require either both latitude and longitude or neither')
      }
    }
  }
})

定义一次,就可以使用这个model了。曾经我也跟你有过一样的想法。

定义模型是这样

class User extends Model{
  constructor(){
    super('users');
	this.name = type.string
	this.age = type.int
  }
}

但是每次调用 const user = new User(); user.findOne({name: "someone"}) 都会对内存造成负担

  1. 因为在constructor里面定义类型,每次new,都会重复
  2. class的内存占用

我稍作对比下:

sequelize: 社区活跃,bug虽多,但起码有修复的希望,不至于一个bug,挂半年没人处理 typeorm: 新型的定义方式,对IDE的智能提示支持很好友。缺点是社区不丰富。

@htoooth 它和 knex 很像,但 knex 不是 orm

@axetroy 你说的那一点点内存负担,基本上可以不用考虑,sequelize 虽然不用 constructor, 但原理差不多,依旧会造成内存负担,并且它的写法并不美观。“除了一些数据库不支持的特性”这个在 modelar 里面基本没有,除非你直接运行 SQL 语句,否则 modelar 所有的方法都能在所有支持的数据库上使用。并且提供了非常友好简便的分页方案。orm 你说它新型,不见得,它只是换了一种语言,对 IDE 提示,只是一个 .d.ts 文件的问题,modelar 虽然目前没有做这个,但原本的 jsdoc 就也很丰富。typeorm 依旧是使用 modelar 的模式,依旧是基于类。并且根据 ts 转换成 js 的代码,要比你用 ts 写的时候多得多。ts 很棒,我承认,但绝不是因为它新,modelar 也新。typeorm 支持 mongodb, 这个 modelar 做不到。

我说的是typeorm的ide提示,是在定义model的时候,以类的属性方式定义。

所以当new一个model的时候,可以有很好的ide提示,这个可不是定义一个.d.ts文件。

model的属性都是动态的,每个model有的属性都不一样。

modelar已经做的很棒了,希望有它的其他分享,比如工作原理等等 :+1:

@axetroy 在vsc中TS的智能提示很棒,还可以F12直接跳转到实体对象定义的文件中

bookshelf 用过最好的Node ORM

@axetroy 确实是 d.ts 的问题,ts 写的程序,在编译后会自动生成 d.ts,但使用纯 js 来写的,可以通过自己写一份 d.ts 来做到。但实际上 vscode 已经能够非常好的支持 jsdoc 了,只是没有 d.ts 描述那么详细,因此之后我也会增加 d.ts 进来的。

回到顶部