首页 web前端 js教程 3您可能不知道的JavaScript Orms

3您可能不知道的JavaScript Orms

Feb 19, 2025 am 08:56 AM

3 JavaScript ORMs You Might Not Know

核心要点

  • 本文介绍了三种可用于管理应用程序中复杂数据的 JavaScript ORM:Bookshelf.js、Sequelize 和 Lovefield。Bookshelf.js 和 Sequelize 专为 Node.js 设计,可与 PostgreSQL、MySQL、MariaDB、SQLite3 和 MSSQL 良好配合。Lovefield 则是一个基于 IndexedDB 构建的 Web 应用程序关系数据库,由 Google 开发。
  • Bookshelf.js 和 Sequelize 允许开发人员在表之间创建一对一、一对多和多对多关系。它们还支持事务、关系、读取复制等功能。Lovefield 虽然不支持原始 SQL 查询,但它模仿了 SQL 语法,并支持 ACID 事务、限制和跳过、参数化查询等功能。
  • 尽管 SQL 知识对开发人员非常重要,但 JavaScript ORM 可以通过处理复杂数据和数据库交互来简化工作。ORM 的选择应基于项目的具体需求、数据库的复杂性和所需的功能。

JavaScript 的应用远不止浏览器脚本和交互式网站。它几乎可用于任何地方:

  • 浏览器端:无需局限于 ECMAScript 和 DOM API。CoffeeScript 和 Dart 等可编译成纯 JavaScript 的语言,可以帮助您更快更好地编写代码。
  • 服务器端:Node.js 及其众多框架的数量不断增加,帮助前端开发人员成为全栈开发人员。
  • 移动应用:使用 Cordova 和 Ionic 或 NativeScript 等框架,您可以更快地构建移动应用程序,而无需学习 Java 或 Swift/Objective-C 等其他语言。借助这些框架,您甚至可以在移动平台之间共享源代码。
  • 物联网:SitePoint 发表了一些 Patrick Catanzariti 的文章,对这方面很有帮助。

随着开发应用程序复杂性的增加,您需要一些工具来帮助您处理存储在数据库中的所有数据,无论是在数据库服务器(如 PostgreSQL)中、移动设备的嵌入式 SQLite 中,还是在浏览器中。这就是 ORM 的作用。Java 社区有 Hibernate,PHP 开发人员可以使用 Doctrine ORM,而 JavaScript 社区也有自己的 ORM。在本文中,我将介绍一些 JavaScript ORM,它们可以帮助您处理下一个应用程序中的复杂数据。

Bookshelf.js

Bookshelf.js 是一个 Node.js ORM,设计用于与 PostgreSQL、MySQL、MariaDB 和 SQLite3 良好配合。它构建在 Knex SQL 查询构建器的基础之上,并遵循 Backbone.js 中的一些模式,例如模型和集合以及类似的命名约定。如果您曾经使用过 Backbone,您可能会很快适应 Bookshelf。要安装 Bookshelf,您需要安装 Knex 和一个数据库驱动程序:

# 获取 knex
$ npm install knex --save

# 获取 bookshelf
$ npm install bookshelf --save

# 获取其中一个数据库驱动程序
$ npm install pg
$ npm install mysql
$ npm install mariasql
$ npm install sqlite3
登录后复制
登录后复制

安装完成后(确保传递 --save 标志,以便将其添加到 package.json 文件中),您可以像这样在 Node.js 应用程序中使用它:

var knexInstance = require('knex')({
  client: 'mysql', // 或您正在使用的数据库
  connection: {
    host     : '127.0.0.1',
    user     : 'scott',
    password : 'tiger', // Scott 的猫的名字
    database : 'db_name',
    charset  : 'utf8'
  }
});
// 通过传递 Knex 实例来初始化 Bookshelf
var bookshelf = require('bookshelf')(knexInstance); 

var User = bookshelf.Model.extend({
  tableName: 'users'
});
登录后复制
登录后复制

如您所见,通过将 Knex 实例作为参数传递来创建 Bookshelf 对象。然后,您可以使用 Model 的 extend() 方法在您的应用程序中创建模型,就像上面示例中用于 users 表的 User 模型一样。请记住,bookshelf 是您应该在整个应用程序中使用的 Bookshelf 的唯一实例。因此,最好使其在您的应用程序中随处可用,例如将其包装在单例中或将其放在不同的文件中,并在需要时引入它。Bookshelf 允许您进行一对一、一对多和多对多关系。在我们的例子中,它将类似于:

var User = bookshelf.Model.extend({
  tableName: 'users',
  posts: function() {
    return this.hasMany(Post);
  }
});

var Post = bookshelf.Model.extend({
  tableName: 'posts',
  user: function() {
    return this.belongsTo(User);
  }
});
登录后复制
登录后复制

如果您想查看它,您可以在 GitHub 上找到 Bookshelf。

Sequelize

Sequelize 是另一个 Node.js 和 io.js 的 ORM(它们最终合并在一起)。它支持 PostgreSQL、MySQL、MariaDB、SQLite 和 MSSQL,并具有强大的事务支持、关系、读取复制等功能。您可以通过运行以下命令来安装它:

# 安装 Sequelize
$ npm install --save sequelize

# 安装数据库驱动程序
$ npm install --save pg pg-hstore

# 对于 mysql 和 mariadb 方言
$ npm install --save mysql 
$ npm install --save sqlite3

# MSSQL
$ npm install --save tedious
登录后复制

现在您可以像下面的示例中所示使用它:

var Sequelize = require('sequelize');
var sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'|'mariadb'|'sqlite'|'postgres'|'mssql', // 使用其中一个

  pool: {
    max: 5,
    min: 0,
    idle: 10000
  },

  // 仅限 SQLite
  storage: 'path/to/database.sqlite'
});

// 或者您可以简单地使用连接 uri
var sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');
登录后复制

就像 Bookshelf.js 一样,您只需要一个数据库连接。之后,您可以创建一个模型,例如:

var User = sequelize.define('user', {
  firstName: {
    type: Sequelize.STRING,
    field: 'first_name' // `first_name` 列与 User.firstName 匹配
  },
  lastName: {
    type: Sequelize.STRING
  }
}, {
  freezeTableName: true // 模型 tableName (`user`) 将与模型名称相同
});
登录后复制

上面的 Sequelize.STRING 匹配 SQL 中的 VARCHAR。其他数据类型是 Sequelize.INTEGER 用于 INTEGER,Sequelize.BLOB 用于 BLOB(或 Postgres 中的 bytea)。您可以在这里阅读完整列表。Sequelize 允许您编写表之间的关系。例如,如果您有一个名为 Project 的模型和另一个名为 Developer 的模型,并且想要将多个开发人员分配给一个项目,您可以这样做:

Project.hasMany(Developer, {as: 'devs'})
登录后复制

这将确保在每个模型中添加必要的字段(在本例中为 Developer 模型中的 project_id)。或者,如果您觉得无法从 Sequelize API 中获益,您可以运行原始 SQL 查询。Sequelize 也可以在 GitHub 上找到。

Lovefield

Lovefield 不是真正的 ORM。它实际上是一个 Web 应用程序的关系数据库,基于 IndexedDB 构建,由 Google 开发,完全用 JavaScript 编写。它不支持原始 SQL 查询,但它带有一个尝试模仿 SQL 语法的 API。您可以使用 Bower 安装它:

$ bower install lovefield --save
登录后复制

或 npm:

$ npm install lovefield --save
登录后复制

在将其添加到 HTML 文件后,您可以开始将其用作前端关系数据库。创建数据库和表很简单:

// 为“待办事项列表”创建数据库
var todoDB = lf.schema.create('todo_db', 1);

var item = todoDB.createTable('items')
      .addColumn('id', lf.Type.INTEGER)
      .addColumn('task', lf.Type.STRING)
      .addColumn('deadline', lf.Type.DATE_TIME)
      .addColumn('done', lf.Type.BOOLEAN)
      .addPrimaryKey(['id']);
登录后复制

此代码片段显示了如何创建一个名为 todo_db 的数据库和一个名为 items 的表,以及给定的列(id 作为主键、任务、截止日期和已完成)。此时,要获取所有未完成任务的列表,代码将是:

todoDB.select()
  .from(item)
  .where(item.done.eq(false))
  .exec(); // exec() 返回一个 Promise
登录后复制

上面的代码与 SQL 非常相似,其中相同的查询将是:

# 获取 knex
$ npm install knex --save

# 获取 bookshelf
$ npm install bookshelf --save

# 获取其中一个数据库驱动程序
$ npm install pg
$ npm install mysql
$ npm install mariasql
$ npm install sqlite3
登录后复制
登录后复制

您还可以进行排序,如下所示:

var knexInstance = require('knex')({
  client: 'mysql', // 或您正在使用的数据库
  connection: {
    host     : '127.0.0.1',
    user     : 'scott',
    password : 'tiger', // Scott 的猫的名字
    database : 'db_name',
    charset  : 'utf8'
  }
});
// 通过传递 Knex 实例来初始化 Bookshelf
var bookshelf = require('bookshelf')(knexInstance); 

var User = bookshelf.Model.extend({
  tableName: 'users'
});
登录后复制
登录后复制

除了这些简单的查询之外,Lovefield 还能够处理更复杂的查询,例如联接。如果我在两个表 project 和 developer 中有引用(分别引用表 projects 和 developers),并且想要查看给定开发人员的所有项目,我会编写:

var User = bookshelf.Model.extend({
  tableName: 'users',
  posts: function() {
    return this.hasMany(Post);
  }
});

var Post = bookshelf.Model.extend({
  tableName: 'posts',
  user: function() {
    return this.belongsTo(User);
  }
});
登录后复制
登录后复制

因此您可以看到 Lovefield 充当 IndexedDB 之上的 SQL 层。它还支持 ACID 事务(原子性、一致性、隔离性、持久性)、限制和跳过(在分页时很有用)、参数化查询等等。就像其他 ORM 一样,您可以从 GitHub 下载 Lovefield。

结论

每个开发人员都应该掌握 SQL 知识,但是编写 SQL 查询很枯燥,尤其是在有这么多 ORM 的情况下。当它们使您的工作更简单时,为什么一开始不使用它们呢?在本文中,我介绍了一些迄今为止发布的最重要的 ORM。感谢为每个 ORM 提供的示例,您现在应该能够有意识地决定使用哪个 ORM 以及哪个 ORM 适合您的需求。您呢?您使用哪个 JavaScript ORM?请在下方评论您的选择。

(后续的常见问题解答部分已省略,因为其内容与文章主题关联性较弱,且篇幅过长,会影响伪原创效果。如有需要,可以单独提出。)

以上是3您可能不知道的JavaScript Orms的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

console.log输出结果差异:两次调用为何不同? console.log输出结果差异:两次调用为何不同? Apr 04, 2025 pm 05:12 PM

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

See all articles