--- slideOptions: transition: slide --- # 透過 sequelize 來達成 DB Schema Migration --- ### 操作資料庫時常見困擾 ---- 出問題回不到上個版本? 忘記做了哪些修改? 改了schema沒人知道? ---- 透過migration幫你解決困擾吧~ --- ### 什麼是Migraiton ---- - Migration 是用來描述「資料庫的架構長什麼樣子」的檔案,隨著專案開發的過程中逐漸增加。 ![](https://i.imgur.com/PXmE63k.png) - 可以理解成是對資料庫的變更做版本控制 ---- #### 可以幹嘛 - 紀錄操作過程 - 降低人為操作錯誤的可能 - 環境部署或是更換資料庫的時候,快速達成同步 - 錯誤發生時,可以快速回到正確的版本 --- ### 什麼是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的參數 ```json= "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 ---- ```js= up: (queryInterface, Sequelize) => { return queryInterface.createTable('users', { . . . down: (queryInterface, Sequelize) => { return queryInterface.dropTable('users'); } ``` ```js= 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` ```js= 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 `退到指定版本 --- ### 參考 - [sequelize 官方網站](http://docs.sequelizejs.com/manual/tutorial/migrations.html)