Hi,大家好,今天來進行後端程式開發最重要的三件事之其一,資料庫的處理,我們在資料庫處理上,絕大多數都是使用sql來進行資料的新增、刪除、修改、查詢的動作,但是此次我們將使用node.js 上廣為人知的 ORM 元件「Sequelize」來進行資料庫的處理,那麼讓我們開始吧!
首先,我們先簡單的來介紹什麼是ORM(Object Relational Mapping),這個東西最早我是在java和.NET上面看到的,大家都知道,java標榜是物件導向語言,所以裡面的所有東西(機乎)都可視為物件,正統的做法也是比資料封裝成一個個的物件來使用,但是有處理過資料庫的人都知道,資料庫是一筆筆資料,所以早期的程式做法,若是要做查詢功能,就是把資料庫中透過 SQL 取得的資料,宣告成為一個個的物件再拿出來使用;若是要新增或修改時,要把表單的資料轉成物件,再將物件的內容逐項讀出,拼成SQL語句後送入資料庫處理,過程十分繁瑣,而且萬一加欄位時,基本上就要哭了,機乎是每段程式都要拿出來檢查。
這時候就發展出了一種套件,他的目的就是透過設定的方式,將物件中的屬性與資料表中的欄位進行對應,我新增物件時,就等於在資料庫中執行資料新增,我進行物件內容的變更時,等同於執行資料修改,這個就是所謂的OR Mapping,他可以幫我們完成資料庫的增、刪、查、改的動作,而且還不用學習SQL*
題外話,ORM套件的出現,在傳統MVC架構上,新增了持久層的觀念,這個觀念的依據,就是資料庫的處理平常不會改來改去,一個穩定的系統,是不可能三天兩頭在加欄位的,因此將OR Mapping做完後,就持久不動了
知道了 ORM 是什麼後,我們就要開始來用 node.js的 ORM 套件了,在這邊我們選用了 Sequelize ,因為它使用簡單,又功能強大,那麼首先,先把 Sequelize 安裝到專案中,安裝動作如下
npm install --save sequelize
npm install --save pg pg-hstore
** 題外話:sequelize基本上支援市面上常見的關聯式資料庫,例如oracle、postgreSQL、MySQL、MS SQL Server、MariaDB…等,但是該套件本身不包含資料庫連線元件,因此除了安裝套件本體之外,還要安裝連線元件,以本次side project來說,我們使用的是postgreSQL,所以要安裝pg pg-hstore 2組套件**
安裝完戎後,就開始使用套件了,在使用套件時,我們需要準備2個檔案,分別是資料章連線設定檔與資料表定義檔
首先先從資料庫連線設定檔開始,標準連線設定如下
'use strict';
const Sequelize = require('sequelize');
let dbStroage = new Sequelize(
"資料庫名稱",
"連線帳號",
"連線密碼",
{
host: "主機IP",
port: "連線port",
dialect: "資料庫方言",
logging: true,
pool: {
max: 20,
min: 0,
idle: 10000
}
});
module.exports = dbStroage;
主要就是設定資料庫的連線資訊,比較特殊的是「資料庫方言」的部份,可設定可不設定,但是畢竟每個資料庫的型態或多或少會不同,若是可以明確指定要用什麼資料庫語言進行操作,於執行階段比較不會有異常情形出現。
log 可在開發階段設定為 true,將log功能打開,正式環境中可視是否有資安需求將其關閉,若打開的話,每次執行時,可檢視 sequelize 轉換出 SQL 內容,方便進行程式偵錯
使用ORM套件時,其實最辛苦的部份就是要依照各資料表進行物件的屬性設定,以告訴套件看到物件帶有 xx 屬性時,要把該屬性的資料放到 oo 欄位中,標準設定容如下
'use strict';
var Sequelize = require("sequelize");
var db = require("./database");
var object = db.define("cases", {
caseid: {
field: "caseid",
type: Sequelize.STRING(40),
primaryKey: true
},
casedesc: {
field: "casedesc",
type: Sequelize.STRING(100),
},
//其他欄位,在此省略
}, {
freezeTableName: true,
timestamps: false
});
module.exports = object;
如上,「var object = db.define("cases", {」即指定要對應的資料表為「cases」,接下來就是針對各欄位進行對應,通用的對應設定如下
物件屬性名稱: {
field: "資料庫欄位名稱",
type: 欄位型態,
},
欄位型態定義時需要注意,建立以常用的文字、數字、日期的型態來進行設定,可以連接至sequelize 之官網查詢。
freezeTableName 預設為 false,若為 false 時,Sequelize 會自動要求報表名稱為複數型,亦即若是報表名稱為 user 時,自動產出之 sql 裡面的報表名稱會變成 users。
timestamps 若設定為 true 時,則寫入時,Sequelize 會自動增加資料儲存的時間戳記欄位,如果資料表中沒有對應之欄位的話,就會出現錯誤。
因此上述2組設定值,建議依照上述範例進行設定
今天先完成 ORM 套件的安裝與資料表的設定,明天將針對套件的使用進行範例說明,那我們明天再繼續吧