在构建成熟的应用程序时,几乎可以肯定您将需要使用数据库。 这样的应用程序需要实现 CRUD,即创建、读取、更新和删除数据的能力。
为此,需要一个数据库。 如果您使用面向对象的编程语言(例如 JavaScript)和关系数据库(例如 MySQL)构建应用程序,那么使用数据库可能会成为一项挑战。
作为 JavaScript 开发人员,您还需要担心关系数据库的复杂细节,弄清楚数据库语法以及如何编写应用程序可能需要的复杂 SQL 查询。
请记住,关系数据库将数据存储在具有行和列的表中,而 JavaScript 则处理对象以及对象之间的关系。 所有这些都可能变得非常耗时且具有挑战性,因此需要对象关系映射器(ORM)。
目录
对象关系映射器(ORM)
ORM 是一种工具,允许开发人员使用面向对象的原则来使用关系数据库。
ORM 充当应用程序代码和所选关系数据库之间的桥梁,允许开发人员使用他们在应用程序代码中使用的相同面向对象原则来使用关系数据库。
ORM 将关系数据库表映射到类,类实例表示表中的记录或行。 类属性用于表示表中的列。
反过来,这意味着开发人员可以使用他们选择的编程语言来创建、读取、更新、删除以及管理数据库中存储的数据,而无需编写复杂的 SQL 语句。
通过使用 ORM,您可以最大限度地减少需要阅读的 SQL 量,并且还可以避免学习新的查询语言来使用数据库。
要了解 ORM 的工作原理,请考虑以下 MySQL 查询来查找 IT 部门的用户
SELECT * FROM users WHERE department="IT";
可以使用 JavaScript ORM 进行相同的查询,如下所示。 请注意在进行相同查询时使用纯 JavaScript。
const users = await User.findAll({ where: { department: 'IT', }, });
使用 ORM 的好处
JavaScript 开发人员可以从使用 ORM 中获得的一些好处包括:
数据库复杂性的抽象
ORM 掩盖了底层数据库的复杂性,允许开发人员通过后端语言而不是复杂的 SQL 与数据库交互。
一些 ORM 还提供查询构建器,这使得通过使用 OOP 原则编写复杂的查询变得轻而易举。 这使得开发人员能够编写更干净、更易于维护的代码,并且更容易调试和更新。
提高生产力
ORM 抽象了编写原始 SQL 查询和管理数据库交互的复杂性,使开发人员能够专注于应用程序的业务逻辑,这是应用程序最重要的部分。
此外,开发人员以更熟悉的 OOP 模式与数据库交互,无需编写大量样板代码或执行重复任务。
ORM 还可用于自动为数据库提供种子并生成数据访问代码。 所有这些因素都极大地提高了开发人员的生产力。
数据库不可知论
ORM 的一个关键功能是它们允许您以与数据库无关的方式编写应用程序代码。 这样,您的应用程序代码就不会固定在单个数据库上,因此您可以轻松切换应用程序正在使用的数据库,而无需更改大部分应用程序代码。
这非常重要,特别是当应用程序需要发展或支持使用多个数据库时。
简单的架构和关系管理
ORM 简化了在数据库中使用模式以及管理数据库实体之间的关系的过程。
一些 ORM 提供从现有数据库自动生成模式等功能,大多数 ORM 提供允许您轻松定义和管理数据库中存储的表之间关系的方法。
增强安全性
ORM 提供增强的数据库安全性,因为它们为您过滤数据并且还在内部使用参数化查询。 参数化查询是使用占位符作为输入值而不是直接使用用户提供的输入的 SQL 查询。
因此,用户提供的输入永远不会直接嵌入到 SQL 查询中。 这使得 ORM 能够保护您的应用程序免受 SQL 注入攻击,从而增强应用程序的安全性。
使用 ORM 的缺点
尽管 ORM 为开发人员带来了很多好处,但它们的使用也存在一些缺点。 这一次,由于它们在数据库之上引入了一个抽象层,因此可能会导致性能开销和使用更多内存。
此外,要使用 ORM,开发人员需要学习如何使用它,如果没有对 SQL 的基本了解,他们就无法使用 ORM 来了解每个命令的实际作用。
也就是说,ORM 对于开发人员来说仍然是一个非常有益的工具,也是使用 OOP 原则构建的应用程序与关系数据库交互的最佳和最简单的方法。 为了帮助您开始使用 ORM,以下是您可以在 JavaScript 应用程序中使用的一些最佳 ORM。
续集
根据其官方文件, 续集 是适用于 Oracle DB、PostgreSQL、MySQL、MariaDB、SQLite、Microsoft SQL Server、IBM DB2 和 Snowflake 数据库的现代 TypeScript 和 Node.js ORM。 Sequelize 是开源的,对于使用 Node.js 框架和关系数据库的开发人员来说,它是一种非常流行的 ORM。
这可以归因于其强大的功能集,这些功能使得在 Node.js 中使用关系数据库变得轻而易举。 首先,Sequelize 是一个基于 Promise 的 ORM,该功能使其能够支持 Promise,而 Promise 是 Node.js 框架的核心功能。
此外,Sequelize 支持急切加载(即执行应用程序代码后立即加载资源)和延迟加载(即直到需要时才立即加载资源)。 Sequelize 还具有可靠的事务支持、读取复制和模型验证,并且允许数据库迁移和同步。
用户在使用 Sequelize 时还可以定义模式之间的关联和关系。 最重要的是,它提供了一组丰富的查询选项,允许开发人员轻松构建复杂的数据库查询。
棱镜
棱镜 是一个开源 ORM,允许您从任何 JavaScript 或 TypeScript 环境轻松管理数据库并与之交互。
Prisma 支持 PostgreSQL、MySQL、Microsoft SQL Server、CockroachDB、SQLite 和 MongoDB。 此外,它还允许与任何 JavaScript 或 TypeScript 框架轻松集成,简化数据库并提高类型安全性。
为了帮助开发人员构建查询,Prisma 有一个称为 Prisma 客户端的功能,该功能具有自动完成功能,并允许开发人员构建适合他们在应用程序中使用的架构的类型安全查询。
开发人员可以从头开始创建自己的模式,或者使用 Prisma 通过内省现有数据库来自动生成模式。
Prisma 的另一个功能是 Prisma migrate,它是一种 Prisma 架构迁移工具,可自动生成可自定义的 SQL 迁移,使用户在将应用程序从开发环境转移到生产环境时拥有完全的控制权和灵活性。
最后,Prisma 用户可以访问 Prisma Studio,这是一个管理用户界面,允许用户查看、探索、操作和理解存储在数据库中的数据。 所有这些功能使 Prisma 成为 JavaScript 和 TypeScript 开发人员的优秀 ORM。
类型ORM
类型ORM 是一个开源 ORM,其开发目标是始终支持最新的 JavaScript 功能并提供附加功能,以允许开发人员创建使用数据库的任何类型的应用程序。
TypeORM 支持 MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、Microsoft SQL Server、Oracle、SAP Hana 和 sql.js 数据库。
TypeORM支持JavaScript和TypeScript编程语言,也支持MongoDB,它不是关系数据库。 TypeORM 适用于 Node.js、浏览器、Ionic、Cordova、React Native、NativeScript、Expo 和 Election 平台。
TypeORM 允许开发人员使用多种数据库类型并使用多个数据库实例。 它还支持和查询缓存、日志记录、事务、关联、急切和惰性关系,并允许迁移和自动迁移生成。
TypeORM 还支持 DataMapper、ActiveRecord、流原始结果、跨数据库和跨模式查询,并为用户提供强大的查询构建器。
微ORM
微ORM 是一个开源 TypeScript ORM,支持 MySQL、MariaDB、PostgreSQL、SQLite 和 MongoDB。 该 ORM 基于 Datamapper、身份映射模式和工作单元。 工作单元用于维护受业务事务影响的实体列表,并且它还协调更改的写入。
这样做的好处是允许自动处理事务、自动批处理所有查询以及直接在所使用的实体中直接实现业务/域逻辑。
MikroORM 还附带了一个元数据感知的 QueryBuilder,具有自动连接支持和一个事件系统,可用于挂钩实体生命周期并改变 UnitOfWork 的工作方式。
使用 MikroORM 播种数据库(即用一组初始数据填充数据库)也更容易,因为它附带的播种器允许您生成任何体积或形状的虚假数据,并使用它来为数据库播种。
最后,MikroORM 还支持轻松的上下数据库迁移。
书架.Js
书架 是 Node.js 的开源 JavaScript ORM。 该 ORM 旨在提供一个简单的库,可用于在 JavaScript 中查询数据库并在这些对象之间形成关系时执行常见任务。 Bookshelf 设计用于与 PostgreSQL、MySQL 和 SQLite3 配合使用。
作为 Node.js ORM,Bookshelf 支持在 Node.js 应用程序中使用 ORM 时使用 Promise 和传统回调。 此外,它还支持事务、多态关联、急切/嵌套急切关系加载以及各种关系。
尽管 Bookshelf 与其他功能更丰富的 ORM 相比并不具有同等水平,但 Bookshelf 的亮点在于它的简单性、灵活性以及阅读、理解其代码库和扩展它的容易程度。 如果您的 JavaScript 项目需要一个简单、精益的 ORM,Bookshelf 是一个很好的选择。
节点 ORM2
节点 ORM2 是一个简单且轻量级的 Node.js ORM,支持 MySQL、SQLite 和 Progress OpenEdge 数据库。 这个 ORM 允许您轻松地在 Node.js 中使用您的模型。 使用模型时,它允许您轻松创建、同步、删除、获取、查找、删除、计数以及批量创建数据模型。
除了附带的内置验证之外,它还允许在模型之间创建关联并定义自定义验证。 Node ORM2 实现了实例单例行为,这确保了当您多次获取同一行时,您始终获得表示该行的相同对象。
吃水线
吃水线 是 Node.js 的基于适配器的 ORM。 它也是 Sails Web 开发框架附带的默认 ORM。 然而,在不使用 Sails 框架的情况下,Waterline 仍然可以使用。
作为一个基于适配器的 ORM,Waterline 通过使用适配器支持使用多个数据库系统。 官方支持的数据库包括 MySQL、PostgreSQL、MongoDB、Redis 和本地存储。
不过,Waterline 还拥有适用于 CouchDB、SQLite、Oracle、Microsoft SQL Server、DB2、Riak、neo4j、OrientDB、Amazon RDS、DynamoDB、Azure Table、RethinkDB 和 Solr 的社区适配器。
Waterline 允许您在项目中使用多个数据库,并且它提供了一个统一的 API 来处理不同的数据库和协议。 这意味着使用 Waterline ORM 编写的代码可以与 ORM 支持的任何数据库一起使用,而无需更改代码。
此外,Waterline 的创建重点在于适配器之间的模块化、可测试性和一致性,使其非常易于使用并与各种数据库集成。
反对.js
反对.js 是一种 ORM,旨在不妨碍您并让您轻松使用 SQL 和底层数据库引擎的全部功能。
在这方面,它提供了 SQL 查询生成器的所有优点,并且能够强大地帮助您处理关系。 SQL 查询生成器是一种简化创建复杂 SQL 查询过程的工具。
Objection.js 提供了一种定义模型及其之间关系的简单方法,除了提供易于使用的事务之外,还具有充分利用 SQL 全部功能的完整创建、读取、更新删除 (CRUD) 功能。
用户还可以预先加载、插入和更新插入对象图,将复杂文档存储为单行并使用 JSON 模式验证。 Objection.js 官方支持 TypeScript 和 JavaScript 编程语言。
结论
作为开发人员,当通过 JavaScript 或 TypeScript 应用程序使用关系数据库时,您最好通过 ORM 与数据库进行交互。
这不仅可以简化数据库交互,还可以提高您的工作效率、减少需要编写的 SQL 并增强应用程序的安全性。
当尝试决定使用什么 ORM 时,请考虑使用本文中突出显示的任何 ORM,具体取决于哪些功能适合您正在构建的应用程序。
您还可以探索最好的 JavaScript 在线编译器。