玩轉Node.js-Sequelize資料遷移
資料庫遷移就像git一樣,我們可以使用Sequelize遷移來幫助我們跟蹤資料庫的更改,並在各個不同時期的資料庫狀態之間進行切換,使用Sequelize遷移,需要安裝 sequelize-cli 工具。
安裝sequelize-cli
由於sequelize-cli
依賴於sequelize
包,sequelize又需要使用mysql2
包來連線資料庫,所以我們需要安裝三個包。
npm i sequelize mysql2 sequelize-cli
如果是區域性安裝方式的話,安裝完成之後進入node_modules目錄下面的.bin目錄下執行sequelizse-cli
命令來測試sequelize-cli是否安裝成功。
執行成功會出現下面資訊。
初始化專案
執行sequelize-cli init
命令初始化sequelize專案,成功執行之後會建立4個資料夾。
- config: 包含配置檔案,它高速CLI如何連線資料庫
- models: 包含你專案的所有模型
- migrations: 包含所有遷移檔案
- seeders: 包含所有種子檔案
config資料夾中的config.json
配置有3個環境,分別是開始環境、測試環境、生產環境。
建立資料庫
sequelize-cli會根據config/config.json
裡面的環境配置資訊自動為我們建立資料庫,預設情況會根據開發環境資訊進行配置。
可以看到資料庫成功建立。
刪除資料庫
sequelize-cli db:drop
命令會根據配置資訊刪除資料庫。
自定義環境變數
1.設定環境變數。
#設定環境變數NODE_ENV的值為home
set NODE_ENV=home
#刪除環境變數,此時會得到home
echo %NODE_ENV%
#還原NODE_ENV的環境變數
set NODE_ENV=
2.在config/config.json
中新增一項環境配置。
"home": { "username": "root", "password": "root", "database": "c4az6_home", "host": "127.0.0.1", "dialect": "mysql" },
3.再使用sequelize-cli建立資料庫就會創建出home環境配置下的資料庫了。
建立模型
使用model:generate
或者model:create
命令建立一個模型檔案
引數:
- --name:模型名稱,必須
- --attributes:欄位列表,必須
參考
sequelize-cli model:create --name User --attributes username:STRING
注意:模型檔案是給程式用的,遷移檔案和種子檔案是給sequelize-cli使用的。
執行遷移
所謂遷移,就是對資料庫進行結構的建立、升級(修改)等操作。
使用db:migrate
會找到遷移檔案,然後執行裡面的程式碼建立表和欄位,同時會在資料庫中建立一個sequelizemeta
的表來記錄遷移的指令碼名稱。
注意db:migrate不能對相同的表反覆遷移,會報錯。
我們可以通過db:migrate:status
命令檢視遷移檔案的狀態。
這個時候,如果有新的需求,要新增表,那麼可以通過下面步驟實現。
1.首先還是建立模型。
2.檢視狀態發現為down,就是未遷移狀態。
3.遷移。
4.連線資料庫進行檢視。
撤銷遷移
db:migrate:undo
命令會撤銷最近的一次遷移操作,會刪除最近一次建立的表,會把sequelizemeta
表裡面的最近一次記錄刪除。
有時候我們撤銷不一定就非要刪表,我們可能會有其他動作,這個時候我們就可以通過手動修改遷移指令碼中的down函式
程式碼來實現自定義撤銷操作。
另外我們還可以通過db:migrate:undo:all
命令來撤銷所有的遷移指令碼。
通過db:migrate:undo --name 指令碼名
命令指定撤銷具體的遷移指令碼。
sequelize-cli db:migrate:undo 20201212030431-create-message.js
那麼如何遷移單個指定的檔案呢?一般情況下我們要遷移的檔案都應該是放在一個單獨的資料夾下面的,然後通過下面命令指定遷移目錄即可。
在表中新增欄位
如何在不影響表原有的情況下新增新的欄位?例如我們給users表中增加一個age欄位。
建立遷移檔案。
sequelize-cli migration:create --name UserAddAge
建立之後找到遷移指令碼檔案,然後在up和down中增加如下程式碼。
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
/**
* Add altering commands here.
*
* Example:
* await queryInterface.createTable('users', { id: Sequelize.INTEGER });
*/
await queryInterface.addColumn(
'users',
'age', {
type: Sequelize.TINYINT
}
)
},
down: async (queryInterface, Sequelize) => {
/**
* Add reverting commands here.
*
* Example:
* await queryInterface.dropTable('users');
*/
await queryInterface.removeColumn(
'users',
'age'
)
}
};
addColumn這個API的第一個引數是你要新增列的表名,age是新增的欄位,type是資料型別。
removeColumn這個API是刪除列。
新增程式碼之後再執行db:migrate
命令發現已經有了age欄位了。
如果我們撤銷的話,也不會影響原有的users表結構,只會把users表中的age欄位刪除。
撤銷最近一次遷移:db:migrate:undo
種子檔案seeder
比如往表裡面新增測試資料的時候我們就可以使用種子檔案來實現。
建立種子檔案
命令:sequelize-cli seed:create --name userTest
新增測試資料
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
/**
* Add seed commands here.
*
* Example:
* await queryInterface.bulkInsert('People', [{
* name: 'John Doe',
* isBetaMember: false
* }], {});
*/
await queryInterface.bulkInsert('users', [
{
username: '張三',
age: 20
},
{
username: '李四',
age: 21
}
])
},
down: async (queryInterface, Sequelize) => {
/**
* Add commands to revert seed here.
*
* Example:
* await queryInterface.bulkDelete('People', null, {});
*/
await queryInterface.bulkDelete('users', null, {});
}
};
up函式裡面的bulkInsert
API第一個引數是要操作的表名,第二個引數是要插入的資料,是一個數組物件的格式。
down函式裡面的bulkDelete
API是用來刪除資料的,這裡是將users表的資料清空。
執行種子檔案
命令:sequelize-cli db:seed:all
- 指定執行種子檔案:
db:seed 種子檔案
- 執行所有種子檔案:
db:seed:all
撤銷種子檔案
命令:sequelize-cli db:seed:undo
- 指定撤銷種子檔案:
db:seed:undo 種子檔案
- 撤銷所有種子檔案:
db:seed:undo:all
如果哪天測試資料被我玩壞了,用這個命令就可以很方便的還原。
種子檔案新增、撤銷預設沒有進行記錄,因此我們需要手動新增記錄,方便以後檢視、溯源。
官方文件告訴我們需要在config/config.json
配置檔案中新增配置。
通過JSON的方式儲存。
"development": {
"username": "root",
"password": "root",
"database": "c4az6_development",
"host": "127.0.0.1",
"dialect": "mysql",
"seederStorage": "json",
"seederStoragePath": "userTestDataLog.json"
}
通過資料庫儲存。
"development": {
"username": "root",
"password": "root",
"database": "c4az6_development",
"host": "127.0.0.1",
"dialect": "mysql",
"seederStorage": "sequelize",
"seederStorageTableName": "userTestDataLog"
},
注意:migration遷移的記錄預設使用資料庫儲存,seeder種子檔案生成的記錄預設是沒有儲存的,需要手動在config/config.json中配置,要麼使用JSON檔案方式並且配置儲存路徑進行儲存,要麼使用資料庫的方式儲存。