iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Software Development

Web專案建置雜談系列 第 20

Web專案建置雜談 - 實作篇(八)

  • 分享至 

  • xImage
  •  

首先要先建立用來進行 database migrations 的專案,sequelize有提供一個cli套件可以讓我們方便的建立 migrations,步驟如下:

  1. 透過 sequelize-cli 建立專案
mkdir dbMigrations
cd dbMigrations
npm init
npm install --save-dev mysql2 sequelize sequelize-cli
  1. 透過指令初始化 sequelize 專案
npx sequelize-cli init
  1. 產生 migrations
npx sequelize-cli migration:generate --name init
Sequelize CLI [Node: 14.19.1, CLI: 6.5.1, ORM: 6.24.0]

migrations folder at "/root/workspace/probability/dbMigrations/migrations" already exists.
New migration was created at /root/workspace/probability/dbMigrations/migrations/20221005094912-init.js .

可以看到產生了/root/workspace/probability/dbMigrations/migrations/20221005094912-init.js這隻遷移檔案

20221005094912-init.js

'use strict';

/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up (queryInterface, Sequelize) {
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */
  },

  async down (queryInterface, Sequelize) {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */
  }
};

  1. 接著我們將進版和退版的 sql 寫入再 up function 裡面,我們暫時先不透過model的方式進行操作都以最原始的 script 方式進行。
'use strict';

/** @type {import('sequelize-cli').Migration} */
module.exports = {
    async up(queryInterface, Sequelize) {
        /**
         * Add altering commands here.
         *
         * Example:
         * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
         */
        await queryInterface.sequelize.query(`
            CREATE TABLE users  (
            id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '編號',
            parent int(11) NULL DEFAULT NULL COMMENT '父帳號',
            is_banned tinyint(1) NULL DEFAULT FALSE COMMENT '是否被封停',
            account varchar(20) NULL DEFAULT NULL COMMENT '名稱',
            password varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密碼',
            created_time timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '創建時間',
            updated_time timestamp(0) NULL COMMENT '更新時間',
            created_name varchar(20) NULL COMMENT '創建人員',
            updated_name varchar(20) NULL COMMENT '更新人員',
            PRIMARY KEY (id) USING BTREE,
            UNIQUE INDEX index_agent(account) USING BTREE
            ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;`);
    },

    async down(queryInterface, Sequelize) {
        /**
         * Add reverting commands here.
         *
         * Example:
         * await queryInterface.dropTable('users');
         */
        await queryInterface.dropTable('users');
    },
};

接著我們就可以在專案根目錄底下進行,版本遷移。

npx sequelize-cli db:migrate // 版本推進
npx sequelize-cli db:migrate:undo // 版本退回

操作了進版之後我們可以看到 mysql 裡面產生了兩個表單

  1. SequelizeMeta: 是用來紀錄我們版本推進的歷程
  2. users: 建立Users的表單

退版亦然,會記錄在SequelizeMeta裡面,這樣我們就可以透過這個紀錄清楚明白的知道我們曾經對database進行了甚麼樣的操作,之後我們對於資料庫的版本就也能好好的控管了。


上一篇
Web專案建置雜談 - 實作篇(七)
下一篇
Web專案建置雜談 - 實作篇(九)
系列文
Web專案建置雜談30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言