iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

Hi,大家好,今天來進行後端程式開發最重要的三件事之其一,資料庫的處理,我們在資料庫處理上,絕大多數都是使用sql來進行資料的新增、刪除、修改、查詢的動作,但是此次我們將使用node.js 上廣為人知的 ORM 元件「Sequelize」來進行資料庫的處理,那麼讓我們開始吧!

什麼是ORM

首先,我們先簡單的來介紹什麼是ORM(Object Relational Mapping),這個東西最早我是在java和.NET上面看到的,大家都知道,java標榜是物件導向語言,所以裡面的所有東西(機乎)都可視為物件,正統的做法也是比資料封裝成一個個的物件來使用,但是有處理過資料庫的人都知道,資料庫是一筆筆資料,所以早期的程式做法,若是要做查詢功能,就是把資料庫中透過 SQL 取得的資料,宣告成為一個個的物件再拿出來使用;若是要新增或修改時,要把表單的資料轉成物件,再將物件的內容逐項讀出,拼成SQL語句後送入資料庫處理,過程十分繁瑣,而且萬一加欄位時,基本上就要哭了,機乎是每段程式都要拿出來檢查。
這時候就發展出了一種套件,他的目的就是透過設定的方式,將物件中的屬性與資料表中的欄位進行對應,我新增物件時,就等於在資料庫中執行資料新增,我進行物件內容的變更時,等同於執行資料修改,這個就是所謂的OR Mapping,他可以幫我們完成資料庫的增、刪、查、改的動作,而且還不用學習SQL*

題外話,ORM套件的出現,在傳統MVC架構上,新增了持久層的觀念,這個觀念的依據,就是資料庫的處理平常不會改來改去,一個穩定的系統,是不可能三天兩頭在加欄位的,因此將OR Mapping做完後,就持久不動了

Sequelize的安裝

知道了 ORM 是什麼後,我們就要開始來用 node.js的 ORM 套件了,在這邊我們選用了 Sequelize ,因為它使用簡單,又功能強大,那麼首先,先把 Sequelize 安裝到專案中,安裝動作如下

  1. 開啟vscode,打開專案後,點擊「檢視」->「終端機」
  2. 輸入下列指令,即完成安裝
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組套件**

Sequelize設定

安裝完戎後,就開始使用套件了,在使用套件時,我們需要準備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 套件的安裝與資料表的設定,明天將針對套件的使用進行範例說明,那我們明天再繼續吧


上一篇
layout 設計
下一篇
實際使用 Sequelize 來撰寫程式
系列文
以vue.js + node.js 搭建一個客服填單系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言