SlideShare a Scribd company logo
Migrations 與 Schema 操作
范聖佑 Shengyou Fan
新北市樹林國⼩小 (2015/07/08)
適
⽤用
5.1
版
單元主題
• 什麼是 Migration?
• 使⽤用 Migration 跟以往的作法有什麼不同?
• 對開發者⽽而⾔言,使⽤用 Migration 有什麼好處?
• 如何使⽤用 Laravel 的 Migration?
• 如何使⽤用 Laravel 的 Schema Builder 操作資料庫?
• 依照⼯工作坊網站規劃書⽰示範如何使⽤用 Migration
Migrations	
  簡介
什麼是 Migration?
• 相對於⼿手動操作資料庫,Migration 的概念是將所有
對 DB 操作的動作,都撰寫成對應的程式碼,透過
執⾏行程式來操作資料庫的變更
• 由於動作變成標準的程式碼,因此每個⼈人拿到
Migration 的開發者,就可以透過執⾏行 migrate 取得
相同的 DB 結構/狀態
• 由於是由程式⾃自動執⾏行,因此可以降低⼿手動操作時
可能發⽣生的失誤,若有在變更的過程中發⽣生問題,
也可以回覆成先前的狀態
• 簡單來說,可以把它視為資料庫的版本控制系統
在有 Migration 之前…
• 由各開發者⼿手動修改資料庫結構與設定,並把步驟
紀錄下來,請其他開發者照著做
• 把修改的步驟 dump 成 sql 檔案,並把 sql 檔傳給其
他開發者
• 只要修改的步驟有誤,就得⼿手動檢查發⽣生問題的原
因;若在修改之前忘了備份,要回到先前的狀況就
很困難
• 若是在⾃自⼰己的開發機上發⽣生錯誤影響較⼩小;但若開
發時是共⽤用資料庫,或是在 staging 機或 production
機上發⽣生時就悲劇了…
Laravel 的 Migration 機制
• artisan 提供兩種指令:
• 產⽣生 migration 檔案的指令
• 執⾏行 migrate 的指令
• artisan 指令除了可以將流程⾃自動化外,也節省開
發者撰寫程式碼的時間
• Laravel 會在資料庫內⾃自動產⽣生⼀一個名為
migrations 的資料表,在這個資料表內紀錄應⽤用程
式 migrate 的歷程 (migration) 及批次 (batch)
為什麼要⽤用 Migration?
• 減少錯誤發⽣生的機率
- 由程式⾃自動化操作資料庫,減少⼿手動操作/⼈人為錯誤
發⽣生的可能
• 團隊合作的需求
- 透過 Migration 達成團隊成員間資料庫同步的需求
• 版本控制的需求
- 將資料庫的歷次變更紀錄下來,若錯誤發⽣生時,可
先回復⾄至先前正確運作的狀態,降低網站 downtime
的時間
若不⽤用 Laravel 的時候…
• 即便不是使⽤用 Laravel 開發時,仍可以⽤用其他獨⽴立的
Migration ⼯工具如:
- Phinx
- dbv.php
Laravel	
  連線設定
Laravel 的資料庫設定檔
• Laravel 的資料庫設定檔放在 config/database.php 裡
設定資料庫連線
//	
  config/database.php	
  
return	
  [	
  
	
   'default'	
  =>	
  'mysql',	
  
	
   'connections'	
  =>	
  [	
  
	
   	
   //	
  略	
  
	
   	
   'mysql'	
  =>	
  [	
  
	
   	
   	
   'driver'	
  	
  	
  	
  =>	
  'mysql',	
  
	
   	
   	
   'host'	
  	
  	
  	
  	
  	
  =>	
  env('DB_HOST',	
  'localhost'),	
  
	
   	
   	
   'database'	
  	
  =>	
  env('DB_DATABASE',	
  'forge'),	
  
	
   	
   	
   'username'	
  	
  =>	
  env('DB_USERNAME',	
  'forge'),	
  
	
   	
   	
   'password'	
  	
  =>	
  env('DB_PASSWORD',	
  ''),	
  
	
   	
   	
   //	
  略	
  
	
   	
   ],	
  
	
   ],	
  
	
   //	
  略	
  
];
預設使⽤用的連線
從	
  env	
  檔讀取環境變數
env('{key}', {default})
• Laravel 提供的 helper function 之⼀一
• 在其中 .env 的 key 值名稱,就會回傳對應的 value
• 若 .env 不存在或 key 值不存在,就會⽤用 default 值取
代
• 範例:
//	
  config/database.php	
  
'database'	
  	
  =>	
  env('DB_DATABASE',	
  'forge'),	
  
'username'	
  	
  =>	
  env('DB_USERNAME',	
  'forge'),	
  
'password'	
  	
  =>	
  env('DB_PASSWORD',	
  ''),
//	
  .env	
  
DB_DATABASE=homestead	
  
DB_USERNAME=homestead	
  
DB_PASSWORD=secret
設定資料庫 port
• 假如需要特別設定資料庫的 port,可⾃自⾏行在 config/
database.php 及 .env 裡增加 port 設定
//	
  config/database.php	
  
/*	
  以上略	
  */	
  
'host'	
  	
  	
  	
  	
  	
  =>	
  env('DB_HOST',	
  'localhost'),	
  
'port'	
  	
  	
  	
  	
  	
  =>	
  env('DB_PORT',	
  3306),	
  
'database'	
  	
  =>	
  env('DB_DATABASE',	
  'forge'),	
  
'username'	
  	
  =>	
  env('DB_USERNAME',	
  'forge'),	
  
'password'	
  	
  =>	
  env('DB_PASSWORD',	
  ''),	
  
/*	
  以下略	
  */
//	
  .env	
  
DB_HOST=localhost	
  
DB_DATABASE=homestead	
  
DB_PORT=8889	
  
DB_USERNAME=homestead	
  
DB_PASSWORD=secret
建⽴立資料庫
• 可⽤用 CLI 或 GUI 連線⾄至資料庫,並建⽴立要給 Laravel
使⽤用的資料庫
• 資料庫命名慣例:
• 專案名稱_環境,如 blog_local
測試資料庫連線
• 設定完資料庫連線設定後,可以先⽤用 artisan 產⽣生
migration 要⽤用的資料表
• 透過產⽣生 migrations 資料表,也可以做為測試資料庫
連線正確的⽅方式
$	
  [php]	
  artisan	
  migrate:install
在資料庫內產⽣生	
  migrations	
  資料表
artisan	
  migrate:install
• 產⽣生 migrations 資料表
- artisan 會使⽤用⺫⽬目前的環境設定連線⾄至資料庫,並產
⽣生⼀一個名為 migrations 的資料表
• 範例:
$	
  php	
  artisan	
  migrate:install
執⾏行 migrate:install
連線失敗
連線成功
從 GUI 確認結果
確認產⽣生 migrations 資料表
Migration	
  實作流程
★ 參考⽂文件:http://laravel.com/docs/5.1/migrations
怎麼做 Migrate?
• 先⽤用 artisan 產⽣生 migration 檔
• 撰寫 migration 檔的內容 (使⽤用 Schema Builder 類別)
• 使⽤用 artisan 執⾏行 migrate 相關指令
• 從 GUI 裡確認執⾏行後的結果
• 測試 rollback 是否正確
• 確認完成! (commit 到版本控制系統)
產⽣生	
  Migration	
  檔
make 系列指令
• artisan 有⼀一系列 make 開頭的指令,可以協助開
發者⾃自動化的產⽣生撰寫程式時所需要的 class 檔案
$	
  php	
  artisan	
  
Laravel	
  Framework	
  version	
  5.1.2	
  (LTS)	
  
Available	
  commands:	
  
/*	
  略	
  */	
  
make	
  
	
  /*	
  略	
  */	
  
	
  make:controller	
  	
  Create	
  a	
  new	
  resource	
  controller	
  class	
  
	
  make:migration	
  	
  	
  Create	
  a	
  new	
  migration	
  file	
  
	
  make:model	
  	
  	
  	
  	
  	
  	
  Create	
  a	
  new	
  Eloquent	
  model	
  class	
  
	
  make:request	
  	
  	
  	
  	
  Create	
  a	
  new	
  form	
  request	
  class	
  
	
  make:seeder	
  	
  	
  	
  	
  	
  Create	
  a	
  new	
  seeder	
  class	
  
	
  /*	
  略	
  */
$	
  [php]	
  artisan	
  make:migration	
  	
  
{action}_{table}_table
產⽣生	
  migration	
  檔案
artisan	
  make:migration
• 產⽣生 migration 檔
- 依照給予的 migration 名稱,產⽣生 migration 檔,並
執⾏行 dump-autoload
- -­‐-­‐create={table_name} 要新增的資料表名稱
- -­‐-­‐table={table_name} 要變更的資料表名稱
• 範例:
$	
  php	
  artisan	
  make:migration	
  create_posts_table	
  -­‐-­‐create=posts	
  
$	
  php	
  artisan	
  make:migration	
  add_email_in_users_table	
  	
  
	
  	
  -­‐-­‐table=users
產⽣生 migration 檔
使⽤用 artisan	
  make:migration 產⽣生 migration 檔
命名與指令慣例
• 為了確保開發者間產⽣生出來的 migration 檔不會有重覆的
檔名,artisan 在產⽣生 migration 檔時,會⾃自動把時間戳
記放在檔名前 (2016_07_08_092638)
• 通常檔名命名以 動作 + 資料表名稱 做組合,中間以「底
線 _ 」區隔
- 常⾒見動作 create, add, remove
- 資料表名稱以複數命名
• 若是新建資料表則加 -­‐-­‐create=	
  參數、若是修改/更新
資料表則加	
  -­‐-­‐table=	
  讓	
  artisan	
  幫你多寫⼀一點程式
碼
撰寫	
  Migration	
  檔
Migration 檔結構
• ⼀一個 Migration 檔裡⼀一定實作兩個 method:
- up (前進):在這個 method 裡,⽤用 Schema Builder
撰寫要對資料庫做的動作,如新增、刪除、重新命
名資料表;修改資料表的欄位名稱、資料類型…等
- down (後退):相對於 up,down 裡要寫的動作就是
up 的相反,也就是說要寫如何將 up 的內容還原回
去,做為版本回溯機制
Migration 檔範例
Schema Builder
• Laravel 提供 Schema 類別,讓開發者可以抽象⽤用同⼀一
種語法操作所有⽀支援的資料庫
• 透過 Schema Facade 可以讓我們:
- 設定資料表使⽤用的引擎
- 建⽴立/更名/刪除資料表
- 新增、更名、刪除資料表欄位
- 更改資料表欄位屬性、增加/刪除資料表欄位索引
- 快速設定 ORM 要使⽤用的時間戳記和軟刪除欄位
★ 語法參考: http://laravel.com/docs/5.1/migrations#creating-tables
建⽴立/更名/刪除資料表
• 建⽴立資料表
• 重新命名資料表
• 刪除資料表
Schema::create('posts',	
  function(Blueprint	
  $table)	
  
{	
  
	
  	
  	
  	
  //	
  
});
Schema::rename($from,	
  $to);
Schema::drop('posts');	
  
Schema::dropIfExists('posts');
新增/更名/刪除欄位
• 建⽴立欄位
• 重新命名欄位
• 刪除欄位
Schema::table('posts',	
  function(Blueprint	
  $table)	
  
{	
  
	
  	
  	
  	
  $table-­‐>string('email');	
  
});
Schema::table('posts',	
  function(Blueprint	
  $table)	
  
{	
  
	
  	
  	
  	
  $table-­‐>renameColumn('from',	
  'to');	
  
});
Schema::table('posts',	
  function(Blueprint	
  $table)	
  
{	
  
	
  	
  	
  	
  $table-­‐>dropColumn('abstract');	
  
});
(要額外安裝	
  doctrine/dbal	
  套件)
資料表欄位設定
• $table-­‐>increments('id');	
  
• $table-­‐>boolean('confirmed');	
  
• $table-­‐>integer('votes');	
  
• $table-­‐>string('name',	
  100);	
  
• $table-­‐>text('description');	
  
• $table-­‐>date('created_at');	
  
• $table-­‐>dateTime('created_at');	
  
• $table-­‐>timestamp('added_on');	
  
• -­‐>nullable()	
  
• -­‐>default($value)	
  
• -­‐>unsigned()
設定時間戳記和軟刪除
• 設定時間戳記
• 設定軟刪除
Schema::table('posts',	
  function(Blueprint	
  $table)	
  
{	
  
	
  	
  	
  	
  $table-­‐>timestamps();	
  //	
  建⽴立時間戳記	
  
	
  	
  	
  	
  $table-­‐>dropTimestamps();	
  //	
  刪除時間戳記	
  
});
Schema::table('posts',	
  function(Blueprint	
  $table)	
  
{	
  
	
  	
  	
  	
  $table-­‐>softDeletes();	
  //	
  建⽴立軟刪除戳記	
  
	
  	
  	
  	
  $table-­‐>dropSoftDeletes();	
  //	
  刪除軟刪除戳記	
  
});
更改欄位屬性、索引
• 更新欄位屬性
• 增加 index
• after 語法
$table-­‐>integer('post_id')-­‐>index();	
  
$table-­‐>string('email')-­‐>unique();
$table-­‐>string('email')-­‐>after('username');
Schema::table('users',	
  function(Blueprint	
  $table)	
  
{	
  
	
  	
  	
  	
  $table-­‐>string('email',	
  500)-­‐>change();	
  
});
設定資料表使⽤用的引擎
• 設定資料表使⽤用引擎
Schema::create('posts',	
  function(Blueprint	
  $table)	
  
{	
  
	
  	
  	
  	
  $table-­‐>engine	
  =	
  'InnoDB';	
  
});
執⾏行	
  Migrate
migrate 系列指令
• artisan 有⼀一系列 migrate 開頭的指令,透過這些指
令來操作資料庫的版本變更
$	
  php	
  artisan	
  
Laravel	
  Framework	
  version	
  5.1.2	
  (LTS)	
  
Available	
  commands:	
  
/*	
  略	
  */	
  
	
  migrate	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Run	
  the	
  database	
  migrations	
  
/*	
  略	
  */	
  
migrate	
  
	
  migrate:install	
  	
  	
  	
  	
  	
  Create	
  the	
  migration	
  repository	
  
	
  migrate:refresh	
  	
  	
  	
  	
  	
  Reset	
  and	
  re-­‐run	
  all	
  migrations	
  
	
  migrate:reset	
  	
  	
  	
  	
  	
  	
  	
  Rollback	
  all	
  database	
  migrations	
  
	
  migrate:rollback	
  	
  	
  	
  	
  Rollback	
  the	
  last	
  database	
  migration	
  
	
  migrate:status	
  	
  	
  	
  	
  	
  	
  Show	
  the	
  status	
  of	
  each	
  migration	
  
/*	
  略	
  */
了解當前 migrate 狀態
• 使⽤用 migrate:status 指令,由 artisan 回傳當前
migrate 狀態
• artisan 會將所有的 migration 檔以表格的⽅方式印
出,並標記各個 migration 被執⾏行的狀態
• 從資料庫裡的 migrations 資料表也可以觀察出⺫⽬目前
migration 被執⾏行的狀態
$	
  [php]	
  artisan	
  migrate:status
顯⽰示當下	
  migrate	
  狀態
artisan	
  migrate:status
• 透過 artisan 了解當前 migrate 執⾏行狀況
- artisan 會以表格的⽅方式回傳⺫⽬目前所有 migration
檔被執⾏行的狀態,從表格裡可以了解哪些 migrate
已經被執⾏行、哪些還沒有?
• 範例:
$	
  php	
  artisan	
  migrate:status
執⾏行 migrate:status
透過 artisan 了解 migrate 現況
執⾏行資料庫變更
• 撰寫完 migration 檔後,要透過 artisan 執⾏行
migrate 指令,這些對資料庫的變更才真的會被執
⾏行
$	
  [php]	
  artisan	
  migrate
執⾏行資料庫變更
artisan	
  migrate
• 呼叫 artisan 執⾏行 migrate 動作
- 撰寫完 migration 檔後,要執⾏行此指令才會正式修
改資料庫
- artisan 會⾃自動依照 migrations 資料表的紀錄進⾏行
版本控管
• 範例:
$	
  php	
  artisan	
  migrate
執⾏行 migrate
透過 artisan 執⾏行 migrate
檢查 DB 修改結果
新建的資料表
Laravel 的 migrate 版次紀錄
測試 rollback
• 雖然 Migration 會協助我們幫資料庫建⽴立版本控制的
回溯機制,但實際上資料庫變更裡的動作內容仍然
是靠⼈人類智慧去完成
• 因此,為確保版本控制的內容是無誤的,在將
Migration 送進版本控制之前,要先測試⼀一下
rollback 的動作是不是正確無誤,以防⽌止真的需要
回溯時無法正確的回復到先前的狀態
• 千萬別偷懶不寫 down 動作,或是沒有測試
rollback!
$	
  [php]	
  artisan	
  migrate:rollback
回溯資料庫變更
artisan	
  migrate:rollback
• 將資料庫的內容回復到前⼀一次的版本
- artisan 會將上⼀一次執⾏行過的 migrate 動作透過
down 函式的內容回復到前⼀一次的版本
- artisan 會⾃自動依照 migrations 資料表的紀錄進⾏行
版本控管
• 範例:
$	
  php	
  artisan	
  migrate:rollback
執⾏行 migrate:rollback
回溯資料庫變更⾄至上⼀一個版本
其他 migrate 指令
• 回到最初狀態
• 回到最初後再重跑⼀一次
• 了解 migrate 產⽣生的 SQL 語法
$	
  php	
  artisan	
  migrate:reset
$	
  php	
  artisan	
  migrate:refresh
$	
  php	
  artisan	
  migrate	
  -­‐-­‐pretend
⼩小提醒 - 1
• 養成習慣使⽤用 migration ⼯工具來操作資料庫,絕對不
要⾃自⼰己去動資料庫的任何設定,以免造成程式碼與
實際資料庫內容不同步
• 除⾮非有特別的原因,⼀一個 migration 儘量只完成⼀一個
動作。需要對多個資料表變更時,就產⽣生多個
migration 檔,讓每個 migrate 的動作單純
⼩小提醒 - 2
• 每次執⾏行 migration 時,都要測試⼀一下 migrate/
migrate:rollback (即 up/down 的內容) 無誤,確
認動作內容都正確後,才將這個階段的變更放⼊入版
本控制內,並 push 出去提供給其他開發者同步
• ⼀一旦將 migration 檔放⼊入版本控制並 push 出去後,
就不可以再修改 migration 檔裡的內容,以免造成其
他⼈人的不同步或錯誤。若因有誤⽽而需要修改資料庫
的狀況時,應該再建⽴立新的 migration 來變更資料庫
⼩小技巧 - 1
• 在輸⼊入 migration 名稱時打錯字怎麼辦?
- 先⽤用 artisan	
  migrate:rollback,重新命名
Class 名稱及檔案名稱,再執⾏行 composer	
  dump-­‐
autoload 及 artisan	
  migrate 指令
- 把產⽣生出來的檔案⼿手動刪除掉、資料庫內資料表砍
掉,再重新產⽣生⼀一次
⼩小技巧 - 2
• 不⼩小⼼心把 migrations 資料表弄壞、或是弄亂無法復原
時怎麼辦?
• 先試試 artisan	
  migrate:reset
- 把所有資料表全部⼿手動刪除,再重新跑⼀一次
artisan	
  migrate 重建所有資料表
實作專案	
  Migration
專案資料庫設計
實作 migration
• 針對專案應⽤用程式需要的三個資料表,⽤用
make:migration 來產⽣生三個 migration 檔
• 撰寫 migration 檔的內容
• 執⾏行 migrate
• 在 GUI 裡檢查結果是否正確
• 測試 migrate:rollback
存檔點
• 試著把現在已經可以運作的程式碼加⼊入版本控制內
• 流程提醒:
- working directory > staging area > commit
單元總結
• 在這個單元裡我們學到了些什麼?
- Migration 的基本概念及使⽤用 Migration 的好處
- Laravel 的 make 相關指令
- Laravel 的 migrate 相關指令
- 設定專案資料庫及實作 Migration
Q & A
歡迎提問討論

More Related Content

PDF
Model & Seeding整合
PDF
Eloquent ORM
PDF
整合 Open ID
PDF
CRUD 綜合運用
PDF
Model 設定與 Seeding
PDF
使用 Controller
PDF
Schema & Migration操作
PDF
Eloquent ORM
Model & Seeding整合
Eloquent ORM
整合 Open ID
CRUD 綜合運用
Model 設定與 Seeding
使用 Controller
Schema & Migration操作
Eloquent ORM

What's hot (20)

PDF
Migrations 與 Schema操作
PDF
開發流程與工具介紹
PDF
CRUD 綜合運用
PDF
Laravel - 系統全攻略
PDF
View 與 Blade 樣板引擎
PDF
Package 安裝與使用
PDF
Model 設定與 Seeding
PDF
開發環境建置
PDF
驗證與訊息
PDF
工作坊總結
PDF
使用 Eloquent ORM
PDF
CRUD 綜合應用
PDF
Route路由控制
PDF
Route 路由控制
PDF
Laravel - 系統全攻略(續)
PDF
View 與 Blade 樣板引擎
PDF
使用 Controller
PDF
View 與 Blade 樣板引擎
PDF
Route 機制
PDF
驗證與訊息
Migrations 與 Schema操作
開發流程與工具介紹
CRUD 綜合運用
Laravel - 系統全攻略
View 與 Blade 樣板引擎
Package 安裝與使用
Model 設定與 Seeding
開發環境建置
驗證與訊息
工作坊總結
使用 Eloquent ORM
CRUD 綜合應用
Route路由控制
Route 路由控制
Laravel - 系統全攻略(續)
View 與 Blade 樣板引擎
使用 Controller
View 與 Blade 樣板引擎
Route 機制
驗證與訊息
Ad

Viewers also liked (11)

PDF
啟動 Laravel 與環境設定
PDF
開發環境建置
PDF
PHP 語法基礎與物件導向
PDF
Composer 套件管理
PDF
使用者認證
PDF
工作坊簡介
PDF
課程簡介
PDF
應用程式佈署
PDF
開發環境建置
PDF
專案啟動與設定
PDF
使用者認證
啟動 Laravel 與環境設定
開發環境建置
PHP 語法基礎與物件導向
Composer 套件管理
使用者認證
工作坊簡介
課程簡介
應用程式佈署
開發環境建置
專案啟動與設定
使用者認證
Ad

Similar to Migrations 與 Schema 操作 (20)

PDF
使用 laravel 的前與後
PDF
專案啟動與環境設定
PPT
PHP & MySQL 教學
PPTX
大型互联网应用架构设计
PPTX
8, lamp
PDF
Mysql proxy cluster
PDF
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
PDF
Open Street Map安裝指引 (Ubuntu 12.04)
PDF
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
PDF
Deployment with Capistrano
DOCX
Puppet安装测试
DOC
康盛创想项目部Linux 服务器部署标准(最新版)
PDF
Web development with zend framework
PDF
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
XLS
Puppet安装总结
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PDF
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
PPT
1~60
使用 laravel 的前與後
專案啟動與環境設定
PHP & MySQL 教學
大型互联网应用架构设计
8, lamp
Mysql proxy cluster
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
Open Street Map安裝指引 (Ubuntu 12.04)
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
Deployment with Capistrano
Puppet安装测试
康盛创想项目部Linux 服务器部署标准(最新版)
Web development with zend framework
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
Puppet安装总结
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
Install oracle ebs r12.1.1 on OEL5.6 x86(include demo)
1~60

More from Shengyou Fan (20)

PDF
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
PDF
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
PDF
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
PDF
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
PDF
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
PDF
How I make a podcast website using serverless technology in 2023
PDF
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
PDF
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
PDF
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
PDF
Using the Exposed SQL Framework to Manage Your Database
PDF
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
PDF
[COSCUP 2022] Kotlin Collection 遊樂園
PDF
初探 Kotlin Multiplatform
PDF
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
PDF
[PHP 也有 Day #64] PHP 升級指南
PDF
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
PDF
Composer 經典食譜
PDF
老派浪漫:用 Kotlin 寫 Command Line 工具
PDF
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
PDF
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
How I make a podcast website using serverless technology in 2023
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
Using the Exposed SQL Framework to Manage Your Database
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] Kotlin Collection 遊樂園
初探 Kotlin Multiplatform
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
[PHP 也有 Day #64] PHP 升級指南
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
Composer 經典食譜
老派浪漫:用 Kotlin 寫 Command Line 工具
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API

Migrations 與 Schema 操作

  • 1. Migrations 與 Schema 操作 范聖佑 Shengyou Fan 新北市樹林國⼩小 (2015/07/08) 適 ⽤用 5.1 版
  • 2. 單元主題 • 什麼是 Migration? • 使⽤用 Migration 跟以往的作法有什麼不同? • 對開發者⽽而⾔言,使⽤用 Migration 有什麼好處? • 如何使⽤用 Laravel 的 Migration? • 如何使⽤用 Laravel 的 Schema Builder 操作資料庫? • 依照⼯工作坊網站規劃書⽰示範如何使⽤用 Migration
  • 4. 什麼是 Migration? • 相對於⼿手動操作資料庫,Migration 的概念是將所有 對 DB 操作的動作,都撰寫成對應的程式碼,透過 執⾏行程式來操作資料庫的變更 • 由於動作變成標準的程式碼,因此每個⼈人拿到 Migration 的開發者,就可以透過執⾏行 migrate 取得 相同的 DB 結構/狀態 • 由於是由程式⾃自動執⾏行,因此可以降低⼿手動操作時 可能發⽣生的失誤,若有在變更的過程中發⽣生問題, 也可以回覆成先前的狀態 • 簡單來說,可以把它視為資料庫的版本控制系統
  • 5. 在有 Migration 之前… • 由各開發者⼿手動修改資料庫結構與設定,並把步驟 紀錄下來,請其他開發者照著做 • 把修改的步驟 dump 成 sql 檔案,並把 sql 檔傳給其 他開發者 • 只要修改的步驟有誤,就得⼿手動檢查發⽣生問題的原 因;若在修改之前忘了備份,要回到先前的狀況就 很困難 • 若是在⾃自⼰己的開發機上發⽣生錯誤影響較⼩小;但若開 發時是共⽤用資料庫,或是在 staging 機或 production 機上發⽣生時就悲劇了…
  • 6. Laravel 的 Migration 機制 • artisan 提供兩種指令: • 產⽣生 migration 檔案的指令 • 執⾏行 migrate 的指令 • artisan 指令除了可以將流程⾃自動化外,也節省開 發者撰寫程式碼的時間 • Laravel 會在資料庫內⾃自動產⽣生⼀一個名為 migrations 的資料表,在這個資料表內紀錄應⽤用程 式 migrate 的歷程 (migration) 及批次 (batch)
  • 7. 為什麼要⽤用 Migration? • 減少錯誤發⽣生的機率 - 由程式⾃自動化操作資料庫,減少⼿手動操作/⼈人為錯誤 發⽣生的可能 • 團隊合作的需求 - 透過 Migration 達成團隊成員間資料庫同步的需求 • 版本控制的需求 - 將資料庫的歷次變更紀錄下來,若錯誤發⽣生時,可 先回復⾄至先前正確運作的狀態,降低網站 downtime 的時間
  • 8. 若不⽤用 Laravel 的時候… • 即便不是使⽤用 Laravel 開發時,仍可以⽤用其他獨⽴立的 Migration ⼯工具如: - Phinx - dbv.php
  • 10. Laravel 的資料庫設定檔 • Laravel 的資料庫設定檔放在 config/database.php 裡
  • 11. 設定資料庫連線 //  config/database.php   return  [     'default'  =>  'mysql',     'connections'  =>  [       //  略       'mysql'  =>  [         'driver'        =>  'mysql',         'host'            =>  env('DB_HOST',  'localhost'),         'database'    =>  env('DB_DATABASE',  'forge'),         'username'    =>  env('DB_USERNAME',  'forge'),         'password'    =>  env('DB_PASSWORD',  ''),         //  略       ],     ],     //  略   ]; 預設使⽤用的連線 從  env  檔讀取環境變數
  • 12. env('{key}', {default}) • Laravel 提供的 helper function 之⼀一 • 在其中 .env 的 key 值名稱,就會回傳對應的 value • 若 .env 不存在或 key 值不存在,就會⽤用 default 值取 代 • 範例: //  config/database.php   'database'    =>  env('DB_DATABASE',  'forge'),   'username'    =>  env('DB_USERNAME',  'forge'),   'password'    =>  env('DB_PASSWORD',  ''), //  .env   DB_DATABASE=homestead   DB_USERNAME=homestead   DB_PASSWORD=secret
  • 13. 設定資料庫 port • 假如需要特別設定資料庫的 port,可⾃自⾏行在 config/ database.php 及 .env 裡增加 port 設定 //  config/database.php   /*  以上略  */   'host'            =>  env('DB_HOST',  'localhost'),   'port'            =>  env('DB_PORT',  3306),   'database'    =>  env('DB_DATABASE',  'forge'),   'username'    =>  env('DB_USERNAME',  'forge'),   'password'    =>  env('DB_PASSWORD',  ''),   /*  以下略  */ //  .env   DB_HOST=localhost   DB_DATABASE=homestead   DB_PORT=8889   DB_USERNAME=homestead   DB_PASSWORD=secret
  • 14. 建⽴立資料庫 • 可⽤用 CLI 或 GUI 連線⾄至資料庫,並建⽴立要給 Laravel 使⽤用的資料庫 • 資料庫命名慣例: • 專案名稱_環境,如 blog_local
  • 15. 測試資料庫連線 • 設定完資料庫連線設定後,可以先⽤用 artisan 產⽣生 migration 要⽤用的資料表 • 透過產⽣生 migrations 資料表,也可以做為測試資料庫 連線正確的⽅方式
  • 16. $  [php]  artisan  migrate:install 在資料庫內產⽣生  migrations  資料表
  • 17. artisan  migrate:install • 產⽣生 migrations 資料表 - artisan 會使⽤用⺫⽬目前的環境設定連線⾄至資料庫,並產 ⽣生⼀一個名為 migrations 的資料表 • 範例: $  php  artisan  migrate:install
  • 19. 從 GUI 確認結果 確認產⽣生 migrations 資料表
  • 21. 怎麼做 Migrate? • 先⽤用 artisan 產⽣生 migration 檔 • 撰寫 migration 檔的內容 (使⽤用 Schema Builder 類別) • 使⽤用 artisan 執⾏行 migrate 相關指令 • 從 GUI 裡確認執⾏行後的結果 • 測試 rollback 是否正確 • 確認完成! (commit 到版本控制系統)
  • 23. make 系列指令 • artisan 有⼀一系列 make 開頭的指令,可以協助開 發者⾃自動化的產⽣生撰寫程式時所需要的 class 檔案 $  php  artisan   Laravel  Framework  version  5.1.2  (LTS)   Available  commands:   /*  略  */   make    /*  略  */    make:controller    Create  a  new  resource  controller  class    make:migration      Create  a  new  migration  file    make:model              Create  a  new  Eloquent  model  class    make:request          Create  a  new  form  request  class    make:seeder            Create  a  new  seeder  class    /*  略  */
  • 24. $  [php]  artisan  make:migration     {action}_{table}_table 產⽣生  migration  檔案
  • 25. artisan  make:migration • 產⽣生 migration 檔 - 依照給予的 migration 名稱,產⽣生 migration 檔,並 執⾏行 dump-autoload - -­‐-­‐create={table_name} 要新增的資料表名稱 - -­‐-­‐table={table_name} 要變更的資料表名稱 • 範例: $  php  artisan  make:migration  create_posts_table  -­‐-­‐create=posts   $  php  artisan  make:migration  add_email_in_users_table        -­‐-­‐table=users
  • 26. 產⽣生 migration 檔 使⽤用 artisan  make:migration 產⽣生 migration 檔
  • 27. 命名與指令慣例 • 為了確保開發者間產⽣生出來的 migration 檔不會有重覆的 檔名,artisan 在產⽣生 migration 檔時,會⾃自動把時間戳 記放在檔名前 (2016_07_08_092638) • 通常檔名命名以 動作 + 資料表名稱 做組合,中間以「底 線 _ 」區隔 - 常⾒見動作 create, add, remove - 資料表名稱以複數命名 • 若是新建資料表則加 -­‐-­‐create=  參數、若是修改/更新 資料表則加  -­‐-­‐table=  讓  artisan  幫你多寫⼀一點程式 碼
  • 29. Migration 檔結構 • ⼀一個 Migration 檔裡⼀一定實作兩個 method: - up (前進):在這個 method 裡,⽤用 Schema Builder 撰寫要對資料庫做的動作,如新增、刪除、重新命 名資料表;修改資料表的欄位名稱、資料類型…等 - down (後退):相對於 up,down 裡要寫的動作就是 up 的相反,也就是說要寫如何將 up 的內容還原回 去,做為版本回溯機制
  • 31. Schema Builder • Laravel 提供 Schema 類別,讓開發者可以抽象⽤用同⼀一 種語法操作所有⽀支援的資料庫 • 透過 Schema Facade 可以讓我們: - 設定資料表使⽤用的引擎 - 建⽴立/更名/刪除資料表 - 新增、更名、刪除資料表欄位 - 更改資料表欄位屬性、增加/刪除資料表欄位索引 - 快速設定 ORM 要使⽤用的時間戳記和軟刪除欄位 ★ 語法參考: http://laravel.com/docs/5.1/migrations#creating-tables
  • 32. 建⽴立/更名/刪除資料表 • 建⽴立資料表 • 重新命名資料表 • 刪除資料表 Schema::create('posts',  function(Blueprint  $table)   {          //   }); Schema::rename($from,  $to); Schema::drop('posts');   Schema::dropIfExists('posts');
  • 33. 新增/更名/刪除欄位 • 建⽴立欄位 • 重新命名欄位 • 刪除欄位 Schema::table('posts',  function(Blueprint  $table)   {          $table-­‐>string('email');   }); Schema::table('posts',  function(Blueprint  $table)   {          $table-­‐>renameColumn('from',  'to');   }); Schema::table('posts',  function(Blueprint  $table)   {          $table-­‐>dropColumn('abstract');   }); (要額外安裝  doctrine/dbal  套件)
  • 34. 資料表欄位設定 • $table-­‐>increments('id');   • $table-­‐>boolean('confirmed');   • $table-­‐>integer('votes');   • $table-­‐>string('name',  100);   • $table-­‐>text('description');   • $table-­‐>date('created_at');   • $table-­‐>dateTime('created_at');   • $table-­‐>timestamp('added_on');   • -­‐>nullable()   • -­‐>default($value)   • -­‐>unsigned()
  • 35. 設定時間戳記和軟刪除 • 設定時間戳記 • 設定軟刪除 Schema::table('posts',  function(Blueprint  $table)   {          $table-­‐>timestamps();  //  建⽴立時間戳記          $table-­‐>dropTimestamps();  //  刪除時間戳記   }); Schema::table('posts',  function(Blueprint  $table)   {          $table-­‐>softDeletes();  //  建⽴立軟刪除戳記          $table-­‐>dropSoftDeletes();  //  刪除軟刪除戳記   });
  • 36. 更改欄位屬性、索引 • 更新欄位屬性 • 增加 index • after 語法 $table-­‐>integer('post_id')-­‐>index();   $table-­‐>string('email')-­‐>unique(); $table-­‐>string('email')-­‐>after('username'); Schema::table('users',  function(Blueprint  $table)   {          $table-­‐>string('email',  500)-­‐>change();   });
  • 37. 設定資料表使⽤用的引擎 • 設定資料表使⽤用引擎 Schema::create('posts',  function(Blueprint  $table)   {          $table-­‐>engine  =  'InnoDB';   });
  • 39. migrate 系列指令 • artisan 有⼀一系列 migrate 開頭的指令,透過這些指 令來操作資料庫的版本變更 $  php  artisan   Laravel  Framework  version  5.1.2  (LTS)   Available  commands:   /*  略  */    migrate                            Run  the  database  migrations   /*  略  */   migrate    migrate:install            Create  the  migration  repository    migrate:refresh            Reset  and  re-­‐run  all  migrations    migrate:reset                Rollback  all  database  migrations    migrate:rollback          Rollback  the  last  database  migration    migrate:status              Show  the  status  of  each  migration   /*  略  */
  • 40. 了解當前 migrate 狀態 • 使⽤用 migrate:status 指令,由 artisan 回傳當前 migrate 狀態 • artisan 會將所有的 migration 檔以表格的⽅方式印 出,並標記各個 migration 被執⾏行的狀態 • 從資料庫裡的 migrations 資料表也可以觀察出⺫⽬目前 migration 被執⾏行的狀態
  • 41. $  [php]  artisan  migrate:status 顯⽰示當下  migrate  狀態
  • 42. artisan  migrate:status • 透過 artisan 了解當前 migrate 執⾏行狀況 - artisan 會以表格的⽅方式回傳⺫⽬目前所有 migration 檔被執⾏行的狀態,從表格裡可以了解哪些 migrate 已經被執⾏行、哪些還沒有? • 範例: $  php  artisan  migrate:status
  • 44. 執⾏行資料庫變更 • 撰寫完 migration 檔後,要透過 artisan 執⾏行 migrate 指令,這些對資料庫的變更才真的會被執 ⾏行
  • 45. $  [php]  artisan  migrate 執⾏行資料庫變更
  • 46. artisan  migrate • 呼叫 artisan 執⾏行 migrate 動作 - 撰寫完 migration 檔後,要執⾏行此指令才會正式修 改資料庫 - artisan 會⾃自動依照 migrations 資料表的紀錄進⾏行 版本控管 • 範例: $  php  artisan  migrate
  • 47. 執⾏行 migrate 透過 artisan 執⾏行 migrate
  • 49. 測試 rollback • 雖然 Migration 會協助我們幫資料庫建⽴立版本控制的 回溯機制,但實際上資料庫變更裡的動作內容仍然 是靠⼈人類智慧去完成 • 因此,為確保版本控制的內容是無誤的,在將 Migration 送進版本控制之前,要先測試⼀一下 rollback 的動作是不是正確無誤,以防⽌止真的需要 回溯時無法正確的回復到先前的狀態 • 千萬別偷懶不寫 down 動作,或是沒有測試 rollback!
  • 50. $  [php]  artisan  migrate:rollback 回溯資料庫變更
  • 51. artisan  migrate:rollback • 將資料庫的內容回復到前⼀一次的版本 - artisan 會將上⼀一次執⾏行過的 migrate 動作透過 down 函式的內容回復到前⼀一次的版本 - artisan 會⾃自動依照 migrations 資料表的紀錄進⾏行 版本控管 • 範例: $  php  artisan  migrate:rollback
  • 53. 其他 migrate 指令 • 回到最初狀態 • 回到最初後再重跑⼀一次 • 了解 migrate 產⽣生的 SQL 語法 $  php  artisan  migrate:reset $  php  artisan  migrate:refresh $  php  artisan  migrate  -­‐-­‐pretend
  • 54. ⼩小提醒 - 1 • 養成習慣使⽤用 migration ⼯工具來操作資料庫,絕對不 要⾃自⼰己去動資料庫的任何設定,以免造成程式碼與 實際資料庫內容不同步 • 除⾮非有特別的原因,⼀一個 migration 儘量只完成⼀一個 動作。需要對多個資料表變更時,就產⽣生多個 migration 檔,讓每個 migrate 的動作單純
  • 55. ⼩小提醒 - 2 • 每次執⾏行 migration 時,都要測試⼀一下 migrate/ migrate:rollback (即 up/down 的內容) 無誤,確 認動作內容都正確後,才將這個階段的變更放⼊入版 本控制內,並 push 出去提供給其他開發者同步 • ⼀一旦將 migration 檔放⼊入版本控制並 push 出去後, 就不可以再修改 migration 檔裡的內容,以免造成其 他⼈人的不同步或錯誤。若因有誤⽽而需要修改資料庫 的狀況時,應該再建⽴立新的 migration 來變更資料庫
  • 56. ⼩小技巧 - 1 • 在輸⼊入 migration 名稱時打錯字怎麼辦? - 先⽤用 artisan  migrate:rollback,重新命名 Class 名稱及檔案名稱,再執⾏行 composer  dump-­‐ autoload 及 artisan  migrate 指令 - 把產⽣生出來的檔案⼿手動刪除掉、資料庫內資料表砍 掉,再重新產⽣生⼀一次
  • 57. ⼩小技巧 - 2 • 不⼩小⼼心把 migrations 資料表弄壞、或是弄亂無法復原 時怎麼辦? • 先試試 artisan  migrate:reset - 把所有資料表全部⼿手動刪除,再重新跑⼀一次 artisan  migrate 重建所有資料表
  • 60. 實作 migration • 針對專案應⽤用程式需要的三個資料表,⽤用 make:migration 來產⽣生三個 migration 檔 • 撰寫 migration 檔的內容 • 執⾏行 migrate • 在 GUI 裡檢查結果是否正確 • 測試 migrate:rollback
  • 62. 單元總結 • 在這個單元裡我們學到了些什麼? - Migration 的基本概念及使⽤用 Migration 的好處 - Laravel 的 make 相關指令 - Laravel 的 migrate 相關指令 - 設定專案資料庫及實作 Migration