---
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)