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的。
除了migration外,model內有會有建立js檔案,當連線到資料庫時,使用model內的設定進行關聯操作,其中model的關聯設定要在constructor內的associate設定
5.5 model關聯設定
model有三種關聯設定:一對一、一對多、多對多關聯
- 一對一關聯:例如一個購物網站中,一個人只有一個購物車
- 一對多關聯:例如一個購物訂單可以有好多筆付款紀錄(付款紀錄也包含付款失敗,所以會有多筆)
- 多對多關聯:例如購物訂單跟產品的關係,同一個產品可能有許多購物訂單下單,相對的一個購物訂單也能有許多下單的產品,中間需要建立一個關聯model
從官方說明中,可以使用BelongsTo、BelongsToMany、HasMany、HasOne來設定關聯
HasOne:
HasOne是model建立一對一關聯時使用,不過實際使用時很少使用到。
BelongsTo、HasMany:
建立一對多關係時,可以使用HasMany、belongsTo來建立:
值得一提的是也可以從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