为什么很多人都喜欢 Django 的 ORM 而不是 SQLAlchemy,是因为简单吗?

关注者
205
被浏览
154,161

12 个回答

先一个字概括:是


Django ORM 的优点

  • 1. 遵循 Active Record 模式,对业务相对来说简单一些的网站来说,对外暴露了简简单单的 OO 操作方式?连 GroupBy 的写法都看不出来 SQL 的痕迹。
  • 2. 对于没上手 SQL 的人来说,照着文档撸代码, 稍微懂一点点SQL, 谈笑间简直就是 Python 一波速推流,简单而暴力。

缺点

  • 1. 没有 Unit Of Work, 这就导致了你需要大量的依据情况来一个一个object的save
  • 2. 没有 Identity Map, 这就导致了会产生很多duplicated 的sql语句 如果你做跨三个表的查询的时候,这个现象就特别明显. 通过 django debug tools 就可以看出来, 当然, 通过 select related 和 prefetch related 也能缓解一下. 或者是走local cache 间接的使用 SQLA
  • 3. JOIN 写起来比较固定。最后发现大部分 JOIN 还是要写 RAWSQL


当然, 上面列的django orm的缺点, 其实sqla帮你解决了大部分

SQLAlchemy 是更加复杂的 ORM 框架,遵循 DataMapper,SQLA 实现了 Unit Of Work , IdentityMap , 对于业务复杂的场景来说,有更好的适应性。

但, 虽然说sqla这么多优点吧, 但架不住复杂到1000多页的使用说明

以及小项目用 Django 真的超级爽.......逃

关于 Python世界里面的 Active Record 和 Data Mapper 可以参考我的文章


目录如下

0x00 前言 : section
0x01 场景 : section
0x02 从原始社会讲起 : section
0x03 数据架构之 Table Data Gateway : section
0x04 数据架构之 Row Data Gateway 和 Active Record : section
0x05 数据架构之 Data Mapper : section
0xDD 结论 : section
    下集预告 : section
0xEE 参考链接 : section

以及关注专栏一起学习 Python/NodeJS/Golang

Django 的 Model 驱动对数据库层面上的实现细节关注的非常少,开发者定义模型的过程非常接近声明式而非过程式,对于新项目来说,可能是这个原因让 Django Model 比 SQLAlchemy 讨人喜欢。

传统的 SQLAlchemy 的使用方法是不入侵模型,在单独的地方定义表结构、映射规则,然后用 SQLAlchemy 驱动注入到模型类里去,这种方法可以完全避免模型与数据库的耦合,但是定义繁琐,要求开发者完全明白 engine、metadata、table、column、mapper 等概念,如果没有读过《企业应用架构模式》一类书籍会被弄得很乱。

现在 SQLAlchemy 提供了 declarative 的方式,和 Django Model 很像,但是和声明式模型还是有一定的距离,好在对于灵活性几乎没损失。但是我对比了一下 Django Model 和 SQLAlchemy declarative,发现 Django Model 还是更简洁一些。例如对于类关联,Django 只要直接声明外键,就自动产生关联对象,而 SQLAlcyhemy 要定义外键、relationship 对象,如果有多个外键还要自己指定 join 规则…… 总之灵活性是好东西,但是不是什么情况下都讨人喜欢的。

我本来想说这个是 ActiveRecord style 和 Data Mapper style 区别导致的,但是细想了一下,Django Model 并不是简单的 ActiveRecord,其对于复杂关联甚至继承的映射都有很好的适应性,应该和 SQLAlchemy 的 declarative 是同类型的,是对 Data Mapper 的 Active Record style 包装。