译者注:本文首先介绍了什么是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. echo shell commands as they are executed

    http://stackoverflow.com/questions/2853803/in-a-shell-script-echo-shell-commands-as-they-are-execute ...

  2. SDWebImage实现原理(怎么实现图片缓存器)

    入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处 ...

  3. iOS笔记061 - 二维码的生成和扫描

    二维码 生成二维码 二维码可以存放纯文本.名片或者URL 生成二维码的步骤: 导入CoreImage框架 通过滤镜CIFilter生成二维码 1.创建过滤器 2.恢复滤镜的默认属性 3.设置内容 4. ...

  4. Microsxxxxxxx-面试总结

    策略题 There are four kinds of cards, respectively, 1,2, 3,4 numbers. There are seven cards for each ty ...

  5. disable-network-config

    network: {config: disabled}

  6. 基于TensorFlow的循环神经网络(RNN)

    RNN适用场景 循环神经网络(Recurrent Neural Network)适合处理和预测时序数据 RNN的特点 RNN的隐藏层之间的节点是有连接的,他的输入是输入层的输出向量.extend(上一 ...

  7. springboot10 framwork

    一.Spring介绍 Spring 是位于业务逻辑层的框架. 优点很多(无缝对接前后层的框架.提供AOP的支持 , 和以前的 Sstruts . Hibernate 组合成了一套框架组合 SSH .现 ...

  8. C 语言 进阶

    清单狂魔,只挖坑不填坑.. 前言 最近经常被询问 C 语言 相关的问题,突然便也觉得需要思考一下 C 语言的进阶了. 我用 C 语言写过的最大的一个项目,也只是那个贪吃蛇,后来就断断续续地用 Pyth ...

  9. 【Android】实验7 BindService模拟通信 截止提交日期2016.5.3

    实验7 BindService模拟通信 [目的] 实现启动端和BindService之间的双向通信 [要求] 1)   实现从启动端传递一个数据至BindService端: 2)   实现使用Bind ...

  10. 【bzoj4898】[Apio2017]商旅 Floyd+分数规划+Spfa

    题目描述 有n个点.m条边.和k种商品.第$i$个点可以以$B_{ij}$的价格买入商品$j$,并以$S_{ij}$的价格卖出.任何时候只能持有一个商品.求一个环,使得初始不携带商品时以某种交易方式走 ...