Node.js建立MySQL 資料庫與資料關聯設定

學習Blog
8 min readAug 22, 2020

--

MySQL已經接觸了一陣子,不過每次需要使用時,大腦都會當機不知道從何開始,所以在這邊筆記基本的流程操作

1. 安裝 MySQL 、 Workbench

官方下載MySQL,選擇適合的作業系統

2. 使用MySQL Workbench建立資料庫(database)

安裝完MySQL同時也會安裝MySQL Workbench,資料的操作、建立也可以在上面執行;在這邊先建立一個名為practice資料庫

其中三行指令是:

  • 如果名為practice的資料庫存在,則把這個資料庫刪除
  • 創造名為practice的資料庫
  • 使用名為practice的資料庫

3. 專案安裝套件

npm i mysql2 sequelize sequelize-cli

其中sequelize是ORM (Object Relational Mapping),用物件導向操作MySQL ,sequelize-cli則提供終端指令介面(command line interface)

4. Sequelize初始化

在建立model前,需要進行初始化的設定,在終端執行:

npx sequelize init//上面寫法等同於下列寫法
node_modules/.bin/sequelize init
// 如果使用-g安裝在全域
npm install -g sequelize-cli
// 可以直接執行
sequelize db:migrate

其中npx是sequelize執行的位置,以前都需要到module內執行,現在使用npx取代;另外npx sequelize有很多其他的指令,可以參考官方文件(Github)。

根據官方文件說明,這個指令會產生4個資料夾

  • config:內有檔案config.json,負責資料庫基本設定,像是要連線到什麼名稱的資料庫、資料庫密碼、連線設定等
  • models:內有檔案index.js,負責連線MySQL與model資料操作;另外model建立時也會在這邊建立檔案,資料表關聯也在這邊設定。
  • migrations:model建立、修改、刪除等操作的版本紀錄。
  • seeders:種子資料夾

4.5 資料庫連線的設定

這邊需要把連線的資料庫名稱(practice)、使用者名稱、密碼更新上去,其中有三個項目,分別是開發環境(development)、測試環境(test)、正式上市環境(production)

至於會使用哪種資料設定,在npx sequelize init建立的models中會根據設定而決定要使用哪種環境

5. Model的建立

同樣的使用sequelize-cli指令來建立model,如果要創造多個欄位,使用,分開;其中注意欄位名稱與,不能有空格,會導致建立失敗

npx sequelize model:generate --name model的名稱 --attributes 欄位名稱:欄位類型// 官方的例子
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string

執行完,migrations資料夾內會多一個js檔案,sequelize-cli會操作這個js檔案在MySQL中建立table,一些欄位的設定像是id、初始值等都可以在這邊預先設定;另外欄位中的up、down分別是建立、移除model的程式碼,但因為還沒有執行的緣故,所以目前資料庫內是沒有table的。

migrations內的js檔案

除了migration外,model內有會有建立js檔案,當連線到資料庫時,使用model內的設定進行關聯操作,其中model的關聯設定要在constructor內的associate設定

5.5 model關聯設定

model有三種關聯設定:一對一、一對多、多對多關聯

  1. 一對一關聯:例如一個購物網站中,一個人只有一個購物車
  2. 一對多關聯:例如一個購物訂單可以有好多筆付款紀錄(付款紀錄也包含付款失敗,所以會有多筆)
  3. 多對多關聯:例如購物訂單跟產品的關係,同一個產品可能有許多購物訂單下單,相對的一個購物訂單也能有許多下單的產品,中間需要建立一個關聯model

官方說明中,可以使用BelongsTo、BelongsToMany、HasMany、HasOne來設定關聯

HasOne:

HasOne是model建立一對一關聯時使用,不過實際使用時很少使用到。

BelongsTo、HasMany:

建立一對多關係時,可以使用HasMany、belongsTo來建立:

一個訂單order有很多付款紀錄payment
付款紀錄payment屬於訂單order

值得一提的是也可以從migration中使用reference建立關聯

// migration 檔案
'use strict';

module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn('Todos', 'UserId', {
type: Sequelize.INTEGER,
allowNull: false,
reference: {
model: 'Users',
key: 'id',
},

});
},

down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn('Todos', 'UserId' );
}
};

BelongsToMany:

當要使用多對多關聯時,需要建立一個關聯model(關聯model則不需要在model中建立關聯,除非有需要),以附圖為例,中間關聯的model為OrderItem

當使用關鍵字items尋找關聯時,資料庫會藉由傳入的外鍵ForeignKey(這邊是OrderId)來尋找相對應的產品

例如固定OrderId為1,就會得到ProductId為8、6、2、9、10、3的Product(Model)資料

6. 將migration設定輸入到MySQL

執行下列指令輸入migrations,資料庫設定會更新到最新的設定為止

npx sequelize db:migrate // Run pending migrations

如果有不滿意的migrations,可以輸入下面指令來移除:

sequelize db:migrate:undo //Reverts a migrationsequelize db:migrate:undo:all //Revert all migrations ran

到這邊MySQL設定跟Migrations設定就差不多了,接著需要建立種子資料

不過篇幅已經非常長了,所以在這邊暫時告一段落,之後會寫在另一篇文章中。

--

--

學習Blog
學習Blog

No responses yet