2.10.Promise-based ORM for Node.js
Last updated
Was this helpful?
Last updated
Was this helpful?
1.What is Sequelize?
2.Installation
3.Usage
Sequelize是Node.js的一個promise-based的ORM. 他支援PostgreSQL, MySQL, SQLite, MSSQL的"方言" (dialects)
Model相當於數據庫中table,有時它也會被稱為“模型”或“工廠“. Model不能通過構造函数創建, 而只能通過sequlize.define方法来定義或通過sequlize.import導入. 通過define定義一個Model, 就相當於定義了一種模型與數據表之間的映射關係, 通過模型可以實現對table紀錄的insert, delete, update, select等操作.
在使用seqenlize的第一種方式進行query前, 必須先進行以下兩件事:
1.建立schema
2.在js檔中編寫對應每個table的model
由於一開始我原本打算使用mysql模組在node.js上進行資料庫操作,因此在建立schema的部分我是直接用SQL語法建立, 以下以我的專案為例說明:
2.在js檔中編寫對應每個table的model
在建立好table們後必須針對每個table編寫相對應的model, 才能讓sequelize映射到tables, 如果有primary key的話也必須指定每個table的primary key; 另外為了在後續查詢時可以必須得知table間的關係 (如一對多, 多對多), 此階段也必須指定關聯性
(1)建立model
初始化 var Sequelize = require('sequelize'); var sequelize = new Sequelize(settings.db_config.database, settings.db_config.user, settings.db_config.password, { host: settings.db_config.host, dialect: 'mysql', pool: { max: 5, min: 0, idle: 10000 } });
編寫model
以上圖中的tester為例, 需要填寫每個對應的欄位即對應的data type, data可參考官網:http://docs.sequelizejs.com/en/latest/docs/models-definition/#data-types; 這邊還需要指定primary key及tableName, tableName就是實體table的名稱為何.
(2)描述關聯性: 為了後續join之用
一對多
以上圖為例, 一個model可對應到多個testplan, 則可以做以下設定, 但是在實體的table也要記得加入foreign key (及constraint)
多對多
以上圖為例, 一個testplan_result以testitem_result作為junction table, 可以對應到多個testitems
Sequelize中有兩種查询:使用Model(模型)中的方法查詢和使用sequelize.query()進行基於SQL語句的原始查詢.
1.以下是我目前所用過的query:
findAll: 查詢並回傳所有結果
findOrCreate:確認資料庫中是否有該查詢結果, 若沒有則建立一筆資料
2.Outer join:
Join基本可分為Inner join, Outer join, Natural join三種
目前測試, sequelize可以做到Inner join (findAll + where)及Outer join (需建立好primary key, foreign key)兩種
Inner join, Outer join, Natural join的差異
1.Inner join: 利用條件式裡的比較運算子結合兩份資料表
2.Natural join:只有連結的資料欄在兩邊的資料表名稱都相同時才會有用
3.Outer join: 又可分為 LEFT, RIGHT, FULL join
LEFT是顯示左欄所有資料與匹配結果
RIGHT是顯示右欄所有資料與匹配結果
FULL是LEFT與RIGHT的連集
example:
以上圖為例, 查詢與testplan_result相關的testplan, testitems, testitem_result:
sequelize code:
1.http://itbilu.com/nodejs/npm/VJIR1CjMb.html 2.http://docs.sequelizejs.com/en/latest/docs/models-definition/#data-types
1.建立schema
SQL code:
output result: