核心要点
JavaScript 的应用远不止浏览器脚本和交互式网站。它几乎可用于任何地方:
随着开发应用程序复杂性的增加,您需要一些工具来帮助您处理存储在数据库中的所有数据,无论是在数据库服务器(如 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中文网其他相关文章!