DB Migration
在開發中使用 sync 可以方便快速修改表結構,但部署環境建議使用 Migration up 與 Migration down。
安裝
首先安裝
npm install sequelize-cli
初始化
npx sequelize-cli init
會產生如下資料夾

在 config 資料夾內把 config.json 改為 config.js
require("dotenv").config();
const { DB_USER, DB_PASS, DB_HOST } = process.env;
module.exports = {
uat: {
username: DB_USER,
password: DB_PASS,
database: "test-db",
host: DB_HOST,
dialect: "mysql",
},
prd: {
username: DB_USER,
password: DB_PASS,
database: "test-db",
host: DB_HOST,
dialect: "mysql",
},
};
產生範例 migration script
sequelize-cli migration:create --migrations-path ./database/migration --name
之後去修改上面產生的 script 檔案
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.addColumn('Users', 'isMale', {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: false,
});
await queryInterface.addColumn('Users', 'count', {
type: Sequelize.TINYINT.UNSIGNED,
allowNull: false,
defaultValue: 0,
});
},
async down(queryInterface) {
await queryInterface.removeColumn('Users', 'isMale');
await queryInterface.removeColumn('Users', 'count');
}
};
執行 migration
NODE_ENV=uat npx sequelize-cli db:migrate --migrations-path ./database/migration
取消 migration
NODE_ENV=uat npx sequelize-cli db:migrate:undo --migrations-path ./database/migration
> sequelize-cli 會自動在 db 新增一張 sequlizeMeta 表,用來記錄執行過的 migratiion script
DB Seeder
建立初始化資料使用,會把資料輸入 DB
在 migrations 資料夾旁邊建立 seeders 資料夾
裡面放入檔案 20240322061229-initial-tasks-campaigns.js
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
const campaignId = 1;
await queryInterface.bulkInsert('Campaigns', [
{
id: campaignId,
name: 'Yield Pass Phase-1',
createdAt: Sequelize.literal('NOW()'),
updatedAt: Sequelize.literal('NOW()'),
},
]);
await queryInterface.sequelize.query(`
INSERT INTO "Tasks" ("campaignId", "createdAt", "updatedAt", title, details) VALUES
(1, NOW(), NOW(), 'test', 'test');
`);
await queryInterface.sequelize.query(`
INSERT INTO "Rewards" ("taskId", category, points, "createdAt", "updatedAt") VALUES
(1, 'test', 200, NOW(), NOW());
`);
},
async down(queryInterface) {
await queryInterface.bulkDelete('Rewards', null, {});
await queryInterface.bulkDelete('Tasks', null, {});
await queryInterface.bulkDelete('Campaigns', null, {});
},
};
之後可執行全部
npx sequelize-cli db:seed:all
或指定檔案
npx sequelize db:seed --seed temp-seeder.js
也可以 undo
npx sequelize-cli db:seed:undo
Last updated
Was this helpful?