译者注:本文首先介绍了什么是ORM,然后从多个方面对Python语言下的两个ORM库Django和SQLAlchemy进行比较,为ORM的选型提供了较为全面的指导建议。以下是译文。

ORM是什么?

在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途。

ORM代表对象关系映射。ORM中的每个单词解释了他们在实际项目中的用途:

  • 对象(Object):这部分表示哪个对象或者在哪种编程语言下使用这个框架,例如Python。
  • 关系(Relational):这部分表示你正在使用的RDBMS数据库(关系数据库管理器系统)。有许多流行的关系数据库,你可能使用以下这些:MSSQL、MySQL、Oracle、PostgreSQL、MariaDB、PerconaDB、TokuDB。关系数据库中最常见的是它们的关系结构(表,列,键,约束等)。
  • 映射(Mapping):最后一部分表示前面两个部分之间的桥接和连接,即对象和数据库表。

因此,可以得到这样的结论:ORM的作用是将编程语言与数据库进行关联,以简化依赖于数据的应用程序的创建过程。

Django和SQLAlchemy的比较

活动记录与数据映射器

Django ORM使用了活动记录的实现:你能在大多数的ORM库中看到这个实现。这意味着数据库中的每一行记录都直接映射到代码中的一个对象,反之亦然。 ORM框架(如Django)不需要预定义模式来使用代码中的属性。你可以直接使用它们,因为框架可以通过查看数据库模式(schema)来“理解”结构。此外,你可以将记录保存到数据库中,因为它映射可以到表中的某个特定行。

SQLAlchemy使用了数据映射器的实现:在使用这种实现时,数据库结构和对象结构之间是分离的(它们不像Active Record实现中那样的一一对应)。在大多数情况下,你必须使用另一个持久层来保持与数据库的交互(例如,保存对象)。所以你不能在使用Active Record实现的时候调用save()方法,但另一方面,你的代码无需知道数据库中的整个关系结构,因为代码和数据库之间没有直接的关系。

那么他们中的哪一个赢得了这场战斗呢?没有。因为这取决于你要完成什么样的任务。我认为,如果你的应用程序大部分只需用到CRUD(创建,读取,更新,删除),不同数据实体之间并没有复杂的规则,则应该使用Active Record实现(Django)。它能让你轻松快速地为你的产品设置MVP,而不会有任何麻烦。如果你的应用程序中有很多“业务规则”和限制,你最好使用数据映射器模型,因为它不会绑架你,强迫你严格按照活动记录的方式进行思考。

用于复杂查询

在某些情况下,Django和SQLAlchemy可以一起使用。在实际的项目中我多次看到Django用于所有常规的CRUD操作,而SQLAlchemy用于更复杂的查询,通常是只读查询。

有关这方面更多的信息和示例,请参阅BetterWorks工程博客(我们没有与他们联系,我们只是喜欢他们的博客帖子:))。

自动创建主键

两个框架的另一个区别是,Django可以为你的表自动创建主键,而SQLAlchemy不会这么做。你必须自己为每个表手动创建主键。你认为谁最了解哪个主键最适合于某个数据库表呢? 根据你的团队的知识和经验,你可以自行决定。

自动提交

默认情况下,Django会自动提交,而SQLAlchemy则不会。这会影响到你使用框架的方式(事务,回滚等)。

支持的数据库

Django和SQLAlchemy都可以与MySQL、PostgreSQL、Oracle和SQLite一起使用。如果你正在使用MSSQL,则应该使用SQLAlchemy,因为它完全支持MSSQL,并且你能找到更多的相关信息和文档。

学习曲线

在网络上有一个很普遍的观点:Django更容易学习。这可能很容易就能看出来,因为它通常用于不怎么复杂的例子。所以,你应该考虑一下你愿意花多少精力在框架的学习上,以此来获得使用SQLAlchemy所带来的更多的灵活性(如果你真的需要它的话)。

社区规模

毫无疑问,SQLAlchemy拥有所有Python ORM框架中的最大的社区。如果社区对你来说很重要(我认为应该是),SQLAlchemy应该是你的选择。这并不意味着你找不到Django等其他框架的任何帮助。你也能收到错误修复、StackOverflow中的问题解答以及你需要的任何其他帮助,但如果使用SQLAlchemy的话,你获取帮助的机会更大。

性能

我认为在这里写这个(X比Y快)是不负责任的。 由于ORM具有非常多的特性和功能,并且它们在每个框架中都是不同的,所以很难得出哪个框架快哪个框架慢的结论。根据我的经验,你使用框架功能的方式会对应用程序数据库层的整体性能产生很大的影响。所以,我建议不要因为框架的性能而选择它,而是要学习如何正确地使用框架并充分利用它。

如果你使用ORM框架运行原始的SQL查询,则可以使用Jooq或对某些查询不使用ORM,你还可以看看EverSQL查询优化器,这可能是最简单的优化查询的方法。

总结

对于任何的比较,我认为最好是留给读者自己做决定。每个例子都是不同的,不同的技术适合不同的例子。看一下上面指出的那些差异,告诉我们你最终做出的决定。

Django和SQLAlchemy区别的更多相关文章

  1. Django和SQLAlchemy,哪个Python ORM更好?

    ORM是什么? 在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途. ORM代表对象关系映射.ORM中的每个单词解释了他们在实际项 ...

  2. tornado with MySQL, torndb, django model, SQLAlchemy ==> JSON dumped

    现在,我们用torndo做web开发框架,用他内部机制来处理HTTP请求.传说中的非阻塞式服务. 整来整去,可谓之一波三折.可是,无论怎么样,算是被我做成功了. 在tornado服务上,采用三种数据库 ...

  3. Flask 和 Django 框架的区别

    1)Flask Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过 Flask自由.灵活,可扩展性强,第三方库的选 ...

  4. flask Django保存session区别

    '''Django中,session保存在服务端的数据库中,数据库中保存请求用户的所有数据,服务端数据中{'随机字符串':加密后的客户相关信息}请求完成后,把随机字符串作为值,返回给客户端,保存在客户 ...

  5. Django学习笔记(1)——初识Django

    一:Web框架介绍 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以快速帮你开发特定的系统. Web框架是别人已经设定好的一个web网站模板,你学习它 ...

  6. 选择一个 Python Web 框架:Django vs Flask vs Pyramid

    Pyramid, Django, 和 Flask都是优秀的框架,为项目选择其中的哪一个都是伤脑筋的事.我们将会用三种框架实现相同功能的应用来更容易的对比三者.也可以直接跳到框架实战(Framework ...

  7. Django项目和Django初体验和创建、目录结构认识

    .MVC的设计方式(跟Flask一样,都是MVC的设计模式) .开发效率高 .功能强大(丰富的第三方组件) .安全性高(帮助开发者规避安全漏洞) 目前市面上使用:Django>Flask #使用 ...

  8. Awesome Django

     Awesome Django    If you find Awesome Django useful, please consider donating to help maintain it. ...

  9. Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态

    一.Django请求生命周期 二.路由层  urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...

随机推荐

  1. 二、mysql数据库之基本操作和存储引擎

    一.知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student,scholl,class_list ...

  2. [bzoj3371][poj2009][Usaco2004 Mar]Moo University - Emergency Pizza Order 定制比萨饼

    标题这么长的..真是让感觉人头大脚轻. 贴题面先. Description     Moo大学的餐厅必须为$C(1\leq C\leq 1000)$头入学的奶牛新生定制比萨饼.比萨饼可以在比萨小屋订做 ...

  3. 9 与python2交互

    1.创建外键 # 创建room表 mysql> create table rooms(id )); Query OK, rows affected (0.01 sec) #创建学生表 mysql ...

  4. requestLayout 无效

    今天,listview 的requestLayout 无效. 最后,我用了 getWindow().getDecorView().requestLayout(); 可以了.

  5. 怎么设置才能让外网ip可以访问mysql数据库[转]

    转自: http://www.hongyanliren.com/89.html 使用mysql中,很多人都会遇到这样的问题:在vps服务器或者云服务器上安装了mysql后,使用其他工具在外网ip之下根 ...

  6. 以最省内存的方式把大图片加载到内存及获取Exif信息和获取屏幕高度和宽度的新方法

    我们在加载图片时经常会遇到内存溢出的问题,图片太大,我们加载图片时,一般都是用的如下一般方法(加载本地图片): /** * 不作处理,去加载图片的方法,碰到比较大的图片会内存溢出 */ private ...

  7. split array

    public boolean splitArray(int[] nums) { return dividSameSumGroup(0,nums, 0,0); } public boolean divi ...

  8. 《Cracking the Coding Interview》——第12章:测试——题目2

    2014-04-24 23:15 题目:你有一段程序,运行了十次每次都在不同的地方崩掉了.已知这段程序只用了标准C或C++库函数,请问有什么思路来找出问题所在. 解法:1. 时间戳每次都不同.2. 随 ...

  9. 【Kernel Logistic Regression】林轩田机器学习技术

    最近求职真慌,一方面要看机器学习,一方面还刷代码.还是静下心继续看看课程,因为觉得实在讲的太好了.能求啥样搬砖工作就随缘吧. 这节课的核心就在如何把kernel trick到logistic regr ...

  10. activiti并发多实例子流程任务处理

    一直在搞工作流(activiti),总结一下关于工作流(activiti)中同时并发处理多个子流程的操作方法. 先说下我要实现的业务: 1.办公室发通知(在系统申报页面上,勾选科室,被选中的科室执行第 ...