本文是 egg Sequelize 的解析和拓展
為什么要使用Migrations
平時我們直接使用mysql的指令去建庫,然后編寫代碼增刪改查數(shù)據(jù)庫础废。但這種方式不利于團隊開發(fā)占卧。
在項目中愉老,數(shù)據(jù)表的結(jié)構(gòu)會不斷地演進驶兜,在不同的環(huán)境中(開發(fā)環(huán)境吞鸭、測試環(huán)境、生產(chǎn)環(huán)境中)菊值,我們都需要同一套數(shù)據(jù)結(jié)構(gòu)外驱,如果快速的變更各個環(huán)境的數(shù)據(jù)表?Migrations
解決了這個問題俊性,它幫我們管理數(shù)據(jù)結(jié)構(gòu)的變更
原理
我們的每一次數(shù)據(jù)表更新,都需要新建一個Migrations
文件
Migrations
文件包含了以下信息
- 操作時間描扯,這個在文件名上
- 數(shù)據(jù)庫的相關操作定页,這些在
Migrations
文件的up
、down
函數(shù)中
有了這些信息绽诚,只要把所有Migrations
文件中up
函數(shù)數(shù)據(jù)庫操作執(zhí)行典徊,即可以將數(shù)據(jù)表更新到最新狀態(tài)
注意:所有的數(shù)據(jù)表修改操作,必須使用Migrations
文件恩够,不能直接使用sql
直接更新卒落,否則無法利用Migrations
正確迭代和回退數(shù)據(jù)庫版本
創(chuàng)建一次數(shù)據(jù)庫的迭代
執(zhí)行命令
npx sequelize migration:generate --name=<操作名稱>
執(zhí)行后,會生成一個 Migrations
文件 (<時間>-init-<操作名稱>.js)蜂桶,代表新的一次迭代
up
執(zhí)行 npx sequelize db:migrate
升級版本
升級版本的時候會調(diào)用up
函數(shù)儡毕,需要在函數(shù)中對數(shù)據(jù)表進行更新迭代(創(chuàng)建、修改、刪除)
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('users', { id: Sequelize.INTEGER });
}
down
執(zhí)行 npx sequelize db:migrate:undo
回退一個變更
回退版本的時候會調(diào)用down
函數(shù)腰湾,需要在函數(shù)中對數(shù)據(jù)表進行更新的逆操作雷恃,例如在up
創(chuàng)建表,down
則是刪除表
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('users');
}
可以通過 db:migrate:undo:all
回退到初始狀態(tài)