實習的時候做乙個php的專案,專案中使用了mysql資料庫,由於專案規模和需求的變更,經常需要對資料庫的設計進行更新,有的時候需要加一些字段,有的時候需要加一些表,每次在不同的開發人員的電腦上和在伺服器上部署專案的時候,都要手動更新資料庫,這樣比較麻煩,也比較容易出錯,很難保證這麼多主機上所有的資料庫都完全一致,所以師兄就讓我研究了一下如何將資料庫更新寫到程式中。
查閱了一些資料,好多人都是將更新寫到公升級指令碼中,有的比較難理解,而且直接用在php專案中不太好用。github上也有很多人在做相關php資料庫更新的專案,專案整體而言比較大,完全可以作為乙個單獨的 開發專案來做,當然實現的功能也比較全面。
由於這個專案中需要更新的資料庫內容並沒有那麼複雜,而且幾乎不需要去刪除任何東西,只涉及到增和改,就考慮自己來寫一些原始碼進行實現,盡量保證了原始碼功能的簡潔。但足夠更新現有的資料庫。本文先說一下實現的思路,不貼原始碼。
首先要對比已經更新過的資料庫和原有資料庫之間的差異,當然這個差異有一定的限制,只比較了更新後的資料庫中有哪些東西是原資料庫中沒有的。當然比較的前提是本地存在這兩個資料庫,一般本地只有乙個資料庫(原資料庫),所以我將更新後的資料庫匯出sql檔案,在php後端程式中執行了這個sql檔案,將它變為可以與本地原有的資料庫進行比較的,當更新完成後,再將其刪掉(其實這個資料庫就是為了和原資料庫進行比較才建立的)。
其次,比較的時候,先比較兩個資料庫的表是否完全一致,如果不一致,一般是更新的資料庫中新增了表(一般不刪表,因為表中可能存有某些有意義的歷史資料,刪除會有影響,所以一般不刪表或字段),那就在本地資料庫將表建好。若兩個資料庫表一致(即更新的資料庫中未新增新錶),則比較兩個資料庫中相同表的表結構是否一致,若不一致,則說明表中增加了字段或修改了字段的型別或者修改了預設值,則對該錶的結構進行更新。實現的思路還是比較簡單清晰。
當時資料庫更新作為系統的乙個功能放進系統,我就將這個功能放在了系統登入的時候進行觸發。但是資料庫更新操作是有風險的,經常會出現更新報錯的情況,這樣就會導致系統無法登入,所以更新操作不能每次都做,需要在特定的條件下觸發,也就是在需要更新的時候才去觸發,所以每次都要去對比系統資料庫的版本號,如果當前版本已經是最新版本,則不需要對其進行更新。
雖然只是乙個系統的乙個子功能點,但是實現的過程中還是踩了不少雷,後面會繼續介紹部分實現的php原始碼和遇到的一些問題以及解決方法。
IP資料庫的自動更新
我們這裡介紹幾個免費ip資料庫的更新,對於國外ip資料,我們使用maxmind的開源專案geoip,而國內ip資料我們使用純真的qqwry,由於qqwry是rara格式的,我們首先在系統安裝unrar wget gzip d unrar 3.7.7 centos.gz mv unrar 3.7.7 ...
EF修改model自動更新資料庫
最近用mvc ef學習時遇到修改model後而資料庫沒更新報錯,就在網上找關於資料遷移自動更新資料庫的,折騰了大半天終於弄了出來 第一步 在程式包管理器控制台裡 enable migrations projectname ef所在的專案名稱 第二步 執行後會在字段生成migrations資料夾,mi...
通過監控資料庫變化實現自動更新快取的終極解決方案
當系統達到一定流量時,一般都會通過增加快取來提高系統效能。下面是最典型的快取原理圖 根據上圖實現的快取機制,簡單而實用,而且程式也比較簡單,確實能大幅度提公升系統效能。但是當程式往資料庫裡增加或者更新資料時,就要同時更新快取,如下圖 當快取很多,並且如果業務建立快取的地方分散在各個功能,各個檔案裡時...