核心要點
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中文網其他相關文章!