laravel中有個(gè)數(shù)據(jù)庫(kù)遷移功能,migration。基本用法就是在database/migrations/的文件夾下面創(chuàng)建遷移數(shù)據(jù)庫(kù)的類,在這個(gè)類中實(shí)現(xiàn)兩個(gè)方法:
up() 和 down()
up表示運(yùn)行這個(gè)數(shù)據(jù)庫(kù)遷移你要做些什么,down表示你回滾這次數(shù)據(jù)庫(kù)遷移你要做些什么。
這樣你就可以使用 php artisan migrate 就可以進(jìn)行數(shù)據(jù)庫(kù)遷移, php artisan migrate:rollback 就可以進(jìn)行遷移回滾。
我一直在想,這個(gè)東西到底是雞肋還是銀彈呢?
這個(gè)功能發(fā)明出來(lái)的大致功能是為了讓各個(gè)環(huán)境更好同步數(shù)據(jù)庫(kù)。比如一個(gè)人A開(kāi)發(fā)一個(gè)評(píng)論模塊,需要做兩個(gè)動(dòng)作,那么A就創(chuàng)建一個(gè)migrate類,在里面用創(chuàng)造一個(gè)評(píng)論表,然后可能在文章表那里增加一個(gè)評(píng)論數(shù)的字段。當(dāng)A把代碼同步到主干分支的時(shí)候,B這個(gè)時(shí)候獲取到了代碼,那么就很簡(jiǎn)單實(shí)用php artisan migrate就能使用代碼增加評(píng)論表和修改文章表字段。甚至于,在測(cè)試環(huán)境修改后到線上環(huán)境運(yùn)行就可以同步表修改了。
但是總是覺(jué)得這里有幾個(gè)問(wèn)題:
首先是這個(gè)功能在項(xiàng)目上線之后很難使用。他至多只能同步各個(gè)人的開(kāi)發(fā)環(huán)境,而不能同步線上環(huán)境。因?yàn)槟阆氚。覀兤綍r(shí)線上修改是先改表還是先上代碼?一般是先改表的。才上代碼的。那么這樣,我們就不大會(huì)選擇在線上直接運(yùn)行php artisan migrate的行為。一旦不會(huì)選擇在上線后使用這個(gè)功能,就代表這個(gè)功能的使用場(chǎng)景大打折扣了。
其次是,這個(gè)行為安全性得不到保障。migrate的行為說(shuō)到底是使用代碼來(lái)控制數(shù)據(jù)庫(kù),和php里面執(zhí)行alter table命令一樣。一般來(lái)說(shuō),改表行為是一個(gè)非常危險(xiǎn)的行為,越危險(xiǎn)行為做的安全路子就是讓鏈條變短。我們使用了php來(lái)執(zhí)行一個(gè)改表命令,萬(wàn)一,數(shù)據(jù)量大的時(shí)候,改表非常慢,鎖表,甚至于觸發(fā)到php的命令耗時(shí)上限等行為?具體這個(gè)改表行為會(huì)有何后續(xù)行為?你如何回滾?這個(gè)時(shí)候,你就會(huì)懵了...用代碼來(lái)管理數(shù)據(jù)庫(kù),我的結(jié)論就是一個(gè),不純正!!什么東西都有其專業(yè)的領(lǐng)域,用最專業(yè)的工具來(lái)做最專業(yè)的事情。
還有就是,migrate的rollback簡(jiǎn)直就是一個(gè)定時(shí)炸彈。我們一般往migrate的down里面寫的是droptable的操作。一旦,萬(wàn)一,這種命令在線上被執(zhí)行了。那么,就相當(dāng)于是一個(gè)rm -rf的命令啊。把所有數(shù)據(jù)都給刪除了。所以,安全起見(jiàn),還是離這個(gè)rollback操作遠(yuǎn)一點(diǎn)好。
下面來(lái)說(shuō)說(shuō)開(kāi)發(fā)階段,在開(kāi)發(fā)階段我們會(huì)頻繁修改數(shù)據(jù)庫(kù),那么這個(gè)時(shí)候,如果你想要維護(hù)一個(gè)很完善的migrate列表,你會(huì)很痛苦地發(fā)現(xiàn)你的migrate下的文件何其多啊。但最后,我們真的關(guān)注數(shù)據(jù)庫(kù)是如何變化的么?其實(shí),不關(guān)注。這些migrate的命令到最后確實(shí)沒(méi)有多大用處。筆者的實(shí)踐經(jīng)歷,到了一個(gè)項(xiàng)目準(zhǔn)備上線的時(shí)候,我都恨不得把這些migrate的文件匯聚成一個(gè)migrate文件呢。。所以呢,在開(kāi)發(fā)階段,維護(hù)一個(gè)migrate列表,我感覺(jué)倒不如維護(hù)一個(gè)db.sql,外加laravel的初始化數(shù)據(jù)工具。每次有數(shù)據(jù)表改動(dòng),讓大家source表,再初始化數(shù)據(jù)更好。
所以,綜上所訴,結(jié)論是:框架的數(shù)據(jù)庫(kù)遷移是個(gè)雞肋。
專注Web開(kāi)發(fā)50年。請(qǐng)加群:
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式