Advertisement

Django vs SQLAlchemy:哪个 Python ORM 更好

阅读量:

(点击上方蓝字,快速关注我们)

发布:伯乐网 - PJing

什么是 ORM?

为了讲解 Python 的 ORM 框架(Django 和 SQLAlchemy)的不同之处,在此之前我们需要深入掌握 ORM 框架的作用。

ORM意为Object Relational Mapping。让我们逐一考察这三个单词:它们恰好揭示了 ORM在真实世界中的作用:

对象 – 这部分表示使用框架的对象和编程语言,例如 Python。

关系 – 涉及到使用的RDBMS(关系数据管理系统)领域中涵盖了众多主流关系型数据库系统,并常见于各种商业应用环境中如MSSQL、MySQL、Oracle数据库等主流平台;PostgreSQL以及MariaDB等开源解决方案;此外还有PerconaDB和TokuDB等专业级产品;这些系统均具备统一的数据模型特征。

映射 – 最后这部分表示前两部分对象和数据表之间的桥梁和连接。

由此可见,ORM 的作用在于通过建立编程语言与数据库之间的联系来简化开发人员构建基于数据的应用系统的过程。

Django 和 SQLAlchemy 之间比较 活动记录 vs 数据映射

Django ORM 采用了基于活动模型的实现方式 —— 这也是大多数 ORM 都采用的方法。实际上,在代码中每个对象对应数据库中的每一行记录是双向对应的。换句话说,在代码中每个对象对应数据库中的每一行记录是双向对应的。也就是说,在大多数 ORM 中都能看到这种直接的映射关系。此外,在某些情况下只需将记录存储在数据库中即可。因为在这种情况下每个对象都可以通过其关联的表中的特定行来实现双向映射的关系。

SQLAlchemy采取数据映射的方式进行持久化操作——当这种方式被应用时,在数据库和对象结构之间会形成一定的差异(它们不像活动记录法那样是一一对应的)。通常情况下,在与数据库交互时需要依赖额外的持久层来完成操作(例如保存对象信息)。因此,在采用活动记录法时仅调用save()方法是不够的(持反对意见),但另一方面代码并不需要深入了解数据库中的整体关系架构情况(因为代码和数据库之间没有直接联系)。

那么,在两者之间是否存在胜者?答案是否定的。因为无论选择哪种方法都会面临各自的挑战与局限性。我认为,在大多数情况下,如果您的应用程序主要是基于 CRUD(创建、读取、更新、删除)操作的,则建议采用活动记录实现(如Django)。这种方法将有助于您快速构建产品的最小功能集(MVP),从而更快地进入市场并验证核心价值。然而,在存在大量“业务规则”和约束条件的情况下,则推荐优先考虑数据映射模型这种方法不会捆绑您的开发路径,并强制按照严格的活动记录模式进行设计。

使用复杂查询

有时会发现,在同一项目中合理搭配应用框架更为高效。在现实开发环境中,则常见的情形是将Django主要用于完成所有标准的增删查改操作(即普通的CRUD操作),而将其扩展库SQLAlchemy则主要用于处理更为复杂的查询需求(通常为只读访问)。

关于这方面更多的资料和更多信息,请访问BetterWorks工程博客(我们没有直接联系, 但我们一如既往地赞赏他们的博客内容)。

主键自动生成

两个框架之间的一大区别在于Django能够自动化地为表格创建主键,而SQLAlchemy则无法实现这一功能。不得不手动为每一张表创建主键。综合考虑优缺点 — 你认为哪种框架更适合表的主键管理?依据团队的专业知识和实践经验,可以自行决定。

自动提交

在默认情况下,默认配置下Django能够实现自动提交;而SQLAlchemy则无法实现这一功能。然而,在实际应用中,默认设置可能会导致事务管理与回滚机制受到影响。

支持的数据库

Django 和 SQL Alchemy 各自都支持 MySQL、PostgreSQL、Oracle 和 SQLite 后端数据库。如果你正在使用 MSSQL 数据库,则建议选用 SQL Alchemy 产品线,并提供更为全面的技术解决方案与丰富文档资源。

学习曲线

普遍共识是 Django 的可学习性相对较高。
这一现象不言而喻的原因在于其应用场景多为基础功能模块。
因此,在深入掌握框架之前,请权衡是否值得投入精力来提高熟练度,并考虑与其交叉使用 SQLAlchemy 来提升灵活性(当然这只有在真正需要的情况下才建议)。

社区规模

毫无疑问,在Python ORM框架中,SQLAlchemy拥有最多的社区支持者。如果对您来说社区极为重要(我的看法是它应该如此),那么SQLAlchemy无疑是最佳选择。这并不意味着对于其他框架如Django等您无法获得任何帮助。您还可以通过StackOverflow获得问题修复、答案以及相关的辅助信息。

性能

我认为仅凭(X 比 Y 快)就断定某件事是不负责任的做法显得片面。由于 ORM 被其丰富的特性和复杂性所影响,在各个框架中的表现也不尽相同;这使得仅凭这些因素做出判断就显得力不从心。基于实践经验而言;其应用层面的整体性能表现存在显著差异;而非仅仅关注其性能优势;而应着重掌握其适用场景和特点

如果在 ORM 框架中采用未经优化的 SQL 查询时、应用 Jooq 或者仅部分查询未启用 ORM,则可深入探讨 EverSQL 查询优化器(链接:http://www.eversql.com/)。其显著特点是实现任何查询的最简化方法。

总结

在任何对比过程中,我倾向于将决策权移交给读者.每个案例之间存在显著差异,不同的技术同样具有适用性.通过上面指出的差异可以看出你做出了何种选择.

看完本文有收获?请转发分享给更多人

关注「P****ython开发者」,提升Python技能

全部评论 (0)

还没有任何评论哟~