2.10.Promise-based ORM for Node.js

2.10.Promise-based ORM for Node.js

This section contain the following items:

  • 1.What is Sequelize?

  • 2.Installation

  • 3.Usage

1.Sequelize

  • Sequelize是Node.js的一個promise-based的ORM. 他支援PostgreSQL, MySQL, SQLite, MSSQL的"方言" (dialects)

2.Installation

3.Model

  • 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語法建立, 以下以我的專案為例說明:

    • 1.建立schema

    • 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

      • (2)描述關聯性: 為了後續join之用

        • 一對多

          • 以上圖為例, 一個model可對應到多個testplan, 則可以做以下設定, 但是在實體的table也要記得加入foreign key (及constraint)

        • 多對多

          • 以上圖為例, 一個testplan_result以testitem_result作為junction table, 可以對應到多個testitems

4.Query

  • 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:

          • SQL code:

          • output result:

reference:

1.http://itbilu.com/nodejs/npm/VJIR1CjMb.html 2.http://docs.sequelizejs.com/en/latest/docs/models-definition/#data-types

Last updated

Was this helpful?