neoblackcap
2016-04-23 18:48:08 +08:00
其他的我就不发表观点了,我只想说『 Django 的自带 ORM 非常优秀,综合评价略强与 SQLAlchemy 』这样的评价没有能说明任何问题,以下是我的见解
在 Python 以及关系型数据库 ORM 中对应的 Django 跟 SQLAlchemy 可谓两个很典型例子。 Django 很明显是从 RoR 里面得到启发,因此很多时候它也很像 RoR ,比如 Django 就是典型的 Active Record,数据库里面的行直接映射成 Model 的实例,并且所有对数据库的操作是直接与实例绑定,例子即为:
New.objects.create(title='sport', author_name='Neo')
对象(实例)不单单封装了数据库表里面的一行(数据)还封装了数据库的操作,以及在这些数据上面有领域逻辑,比如:
User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
Active Record 对象不仅仅有访问数据的一些方法,而且还有领域逻辑(我们实际的业务逻辑),而且领域模型中的数据跟数据库基本吻合
而 SQLAlchemy 的领域模型就不一样, SQLAlchemy 是基于 Data Mapper 设计而成的。 SQLAlchemy 的数据操作是不能直接作用与实例,它是通过一个 proxy(Data Mapper)来维护领域模型(大致上对应 SQLAlchemy 里面我们定义的 Model )跟数据库表的映射关系,它最大的优点便是数据库表跟领域模型是两个独立的概念,他们之间的关系是解耦的,因此他们可以独立演变,这之后需要做的只不过是我们去更新 Data Mapper 。因此 SQLAlchemy 给我的最大印象就是,它可以实现多态,比如一个 Animal 类可以对应数据库里面的 Dog 跟 Cat 表,以至于一个 Animal 的 cry 方法可以返回"woof"或者"meow"
同时 SQLAlchemy 还有 core 模块去提供高效率的查询(效率可以达到 raw sql 的水平)同时它的查询方式跟 Django 比起来更多样,比如 SQLAlchemy 的 ORM 模块能提供跟以下 SQL 语句对应的查询方式(仅通过一个查询):
select username, score from users join classmates on users.user_id=classmates.user_id where classmates.age > 20 group by (users.username, MAX(users.score));
我个人是觉得 SQLAlchemy 从功能以及灵活性来说都是源于强于其他 ORM ( python 以及对应关系型数据)。但是它跟 Django 比起来就是它有一个很陡峭的学习曲线,这是它的最大缺点。因此我是建议简单项目或者与 Django 相关的使用 Django ORM ,其他的话,若是你们团队协作,而且会有领域模型跟数据库表演进速度不一致的情况,那么选用 SQLAlchemy 是一个不错的选择。