Django和SQLAlchemy,哪个Python 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 vs SQLAlchemy – Which Python ORM is better?
作者:EverSQL团队
翻译:雁惊寒
Django和SQLAlchemy,哪个Python ORM更好?的更多相关文章
- Python ORM框架之SQLAlchemy
前言: Django的ORM虽然强大,但是毕竟局限在Django,而SQLAlchemy是Python中的ORM框架: SQLAlchemy的作用是:类/对象--->SQL语句--->通过 ...
- SQLAlchemy(1) -- Python的SQLAlchemy和ORM
Python的SQLAlchemy和ORM(object-relational mapping:对象关系映射) web编程中有一项常规任务就是创建一个有效的后台数据库.以前,程序员是通过写sql语句, ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Django和SQLAlchemy区别
译者注:本文首先介绍了什么是ORM,然后从多个方面对Python语言下的两个ORM库Django和SQLAlchemy进行比较,为ORM的选型提供了较为全面的指导建议.以下是译文. ORM是什么? 在 ...
- Python3+SQLAlchemy+Sqlite3实现ORM教程
一.安装 Sqlite3是Python3标准库不需要另外安装,只需要安装SQLAlchemy即可.本文sqlalchemy版本为1.2.12 pip install sqlalchemy 二.ORM操 ...
- 灵活使用 SQLAlchemy 中的 ORM 查询
之前做查询一直觉得直接拼 SQL 比较方便,用了 SQLAlchemy 的 ORM 查询之后,发现也还可以,还提高了可读性. 这篇文章主要说说 SQLAlchemy 常用的 ORM 查询方式,偏实践. ...
- python/ORM操作详解
一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...
- MySQL(Python+ORM)
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
- Django之模型层-了解ORM
ORM(对象-关系-映射)简单使用 ORM实现了数据模型与数据库的解耦合,即数据模型的设计不需要指定特定的数据库,通过python代码可以直接对数据库实现增删改查 MySQL语法 #sql中的表 #创 ...
随机推荐
- SQL-48 将所有获取奖金的员工当前的薪水增加10%。
题目描述 将所有获取奖金的员工当前的薪水增加10%.create table emp_bonus(emp_no int not null,recevied datetime not null,btyp ...
- Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单
1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...
- raid的一些简单知识
日一.RAID定义RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁 ...
- 解决VS2010使用mscomm控件无法接收数据的问题【转】
之前有用过VC6的mscomm控件.所以这次也想继续用此控件实现此功能,结果没想到刚一上手还真的绕了不少弯子.主要是因为VC2010下对mscomm控件的添加,以及对控件成员变量的添加有点小繁琐,特此 ...
- java001单词拼写
System.out.printIn("string"); 报错: 百度大神指点,是小写的l而不是大写的I,应该为 System.out.println("Hello S ...
- jQuery-2.DOM---节点的删除
DOM节点删除之empty()的基本用法 要移除页面上节点是开发者常见的操作,jQuery提供了几种不同的方法用来处理这个问题,这里我们开仔细了解下empty方法 empty 顾名思义,清空方法,但是 ...
- Win10+Ubuntu双系统删除Ubuntu方法
前情提要 Win10下试了许多种方法,什么MbrFix.EasyBCD.亦或是Boot Option.都不行.前两者不行,操作之后重启无法直接进入Windows,后者也不行,找不到所谓的Delete ...
- python中datetime常用方法
# 可运算的时间方法包 >>> import datetime >>> import time >>> res = datetime.dateti ...
- day04列表
列表 内容详细 1.列表 公共 独有方法 删除 remove pop clear del区别 强制转换 #表示多个事物 users=["lili","Joe", ...
- 19/03/13python学习笔记
1.变量命名 name1 = 1 name2 = "sunj" 2.命名变量的规则 (1.变量是字母.数字.下划线的组合(2.不能以数字开头(3.不能用关键词命名变量(4.变量中间 ...