Try   HackMD

透過 sequelize 來達成 DB Schema Migration


操作資料庫時常見困擾


出問題回不到上個版本?

忘記做了哪些修改?

改了schema沒人知道?


透過migration幫你解決困擾吧~


什麼是Migraiton


  • Migration 是用來描述「資料庫的架構長什麼樣子」的檔案,隨著專案開發的過程中逐漸增加。

  • 可以理解成是對資料庫的變更做版本控制


可以幹嘛

  • 紀錄操作過程
  • 降低人為操作錯誤的可能
  • 環境部署或是更換資料庫的時候,快速達成同步
  • 錯誤發生時,可以快速回到正確的版本

什麼是sequelize


是nodejs的 ORM框架
可以理解成與資料庫溝通的框架


動動手時間


環境:nodejs, mysql


首先建立新的資料庫

mysql -u user -p -e "create database demo"


建立專案和安裝sequelize

mkdir demo && cd demo
npm init
npm install -g sequelize-cli cli也可以安裝在專案底下
npm install --save sequelize mysql2


使用sequelize建立一張user table

sequelize init

修改config裡,連接DB的參數

"development": { "username": "user", "password": "password", "database": "database name", "host": "127.0.0.1", "dialect": "mysql" },

sequelize model:generate --name user --attributes name:string,mail:string


小心有雷

這時候下指令會建立一張user"s" table

所以要去修改一下剛剛產生在migration底下的js檔案裡面的code,將users 改成user


up: (queryInterface, Sequelize) => { return queryInterface.createTable('users', { . . . down: (queryInterface, Sequelize) => { return queryInterface.dropTable('users'); }
up: (queryInterface, Sequelize) => { return queryInterface.createTable('user', { . . . down: (queryInterface, Sequelize) => { return queryInterface.dropTable('user'); }

修改完成之後,就可以下指令建一張新的table啦~

sequelize db:migrate

這個指令會自動建立到最後一個migration檔案


sequelize migration:generate --name add_phone_to_user

up: function (queryInterface, Sequelize) { queryInterface.addColumn( 'user', 'phone', { type: Sequelize.STRING, allowNull: true } ) }, down: function (queryInterface, Sequelize) { return queryInterface.removeColumn('driver_payments', 'phone') }

可以建立也可以回溯

sequelize db:migrate:undo 一次退一個版本

sequelize db:migrate:undo:all 退到初始狀態

sequelize db:migrate:undo:all --to XXXXXXXXXXXXXX-create-user.js 退到指定版本


參考