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中的表 #创 ...
随机推荐
- svn提示文件 is already locked
有时候在提交代码或者更新代码的时候svn会报错误,提示请执行"clean up",但是有时候执行"clean up"也没有什么用,不过当执行"clea ...
- main函数
class Main { public static void main(String[] args) //new String(0) { System.out.println(args); // [ ...
- 如何ASP.NET Core Razor中处理Ajax请求[转载]
在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过. 今天闲来无事,准备用Rozor做个项目熟练下,结果写第一个页面就卡住了..折腾半天才搞好 ...
- mongodb初步使用体验
前言 Mongodb是一个非常有名的缓存数据库,和它名气相当的还有redis和hbase.笔者之前使用过redis,memcache和elasticsearch,借着工作机会,正好可以好好学习一下mo ...
- gpu/mxGPUArray.h” Not Found
https://cn.mathworks.com/matlabcentral/answers/294938-cannot-find-lmwgpu More specifically change th ...
- 百度前端代码规范:HTML
HTML 1.代码风格 1.1缩进与换行 [强制] 使用 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符. <style> ul { padding:; } < ...
- some working learning总结学习
1. Python通过pypyodbc访问Access数据库 https://blog.csdn.net/jisuanjiguoba/article/details/73163721 2. java大 ...
- Jekins学习
1.Windows 安装入门 https://blog.csdn.net/u011541946/article/details/78003772 PS:坑1,https问题 坑2,offline ...
- The problems when using a new ubuntu 18.04
how to install dual systems (windows & ubuntu) Donwloading the ubuntu from web. Using refu to cr ...
- 整数的故事(4)——Karastuba算法
我们在小学就学过用竖式计算两个多位数的乘法: 这个过程简单而繁琐,没有最强大脑的普通大众通常是用计算器代替的.然而对于超大整数的乘法,计算器也未必靠得住,它还存在“溢出”一说.这就需要我们自行编写算法 ...