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

3您可能不知道的JavaScript Orms

Lisa Kudrow
发布: 2025-02-19 08:56:17
原创
763 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板