


版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、19.管理數(shù)據(jù)庫變化Evolution當使用關系數(shù)據(jù)庫時,你需要去跟蹤和安排數(shù)據(jù)庫 schema (結(jié)構)變化,特別 是有多個存儲位置的情況下,你就需要更多的經(jīng)驗來跟蹤數(shù)據(jù)的 schema變化:當處理團隊合作進行開發(fā)時,每個人都需要知道數(shù)據(jù)庫結(jié)構的變化當部署到生產(chǎn)服務器上時,就需要一個穩(wěn)健的方式去更新數(shù)據(jù)庫結(jié)構如果在多臺數(shù)據(jù)庫服務器上工作時,就需要保持所有數(shù)據(jù)庫結(jié)構同步如果在JPA下工作,Hibernate會自動為你處理好這些數(shù)據(jù)庫變化。如果你不打 算使用JPA或打算手工對數(shù)據(jù)庫結(jié)構進行更好的調(diào)整,那么Evolutions將非常有用。Evolutio ns腳本Play使用evolutions
2、腳本來跟蹤你的數(shù)據(jù)庫變化。這些腳本采用的是原始的 sql語句來書寫的,應該位于應用程序的 db/evolutions目錄。第一個腳本名叫1.sql,第二為2.sql,以此類推每個腳本包含了兩部分:* Ups部分用于描述必要的轉(zhuǎn)換* Dow ns部分用于描述如何恢復他們比如,查看第一個evolution腳本,這個腳本用于引導一個基本的應用:# Users schema# - !UpsCREATE TABLE User (id bigi nt(20) NOT NULL AUTO_INCREMENT,email varchar(255) NOT NULL,password varchar(255)
3、NOT NULL,full name varchar(255) NOT NULL,isAdmin boolean NOT NULL,PRIMARY KEY (id);# - !Dow nsDROP TABLE User;正如你看到的一樣,必須在sql腳本里使用注釋來界定 Ups和Dow ns節(jié)如果在applictaion.conf里配置了數(shù)據(jù)庫,那么Evolutions將被自動激活,而且 evolution scripts將被顯示出來。通過設置 evolutions.enabled為 false可以禁此顯示腳本。比如,當測試他們自己的數(shù)據(jù)庫里,你可以為測試環(huán)境設置 為禁用模式。當evoluti
4、ons 被激活后, 在DEV莫式下,Play將為每個請求檢查數(shù)據(jù)庫結(jié)構 狀態(tài),或在PRODS式下啟動應用程序時進行數(shù)據(jù)庫結(jié)構狀態(tài)檢查。在DEV莫式下,如果數(shù)據(jù)庫結(jié)構不是最新的,一個錯誤頁面會顯示出來,它會建議你運行合 適的sql腳本同步你的數(shù)據(jù)結(jié)構。Application error+ * http: / /local host:9000/Your database needs evolution!An SQL script will be run on your database,This SQL script must be run:CREATE TABLE User (id bigint
5、(20) NOT NULL AUTO_INCREHENTf email varchar(255) NOT NULL, password varchar(255) NOT NULL, fallnamc varchar(255) NOT NULL, iaAdmin boolean NOT KULL tPRIMARY KEY (idThis exception has been logged with id 662c0klcb 如果你同意推薦的SQU腳本,你可以點擊 Apply evolutions 按鈕執(zhí)行該建議 腳本。如果使用的是內(nèi)存數(shù)據(jù)庫 ( db=mem), 并且數(shù)據(jù)庫是空的情況下, Pla
6、y 會自動運行 所有的 evolutions 腳本。同步同時發(fā)生的改變現(xiàn)在讓我們假定現(xiàn)在在同一項目中有兩個開發(fā)者,A開發(fā)者因工作需要必須創(chuàng)建一個新的數(shù)據(jù)庫表,因此他將 2.sql evolution 腳本:# Add Post# - !UpsCREATE TABLE Post (id bigint(20) NOT NULL AUTO_INCREMENT,title varchar(255) NOT NULL,content text NOT NULL, postedAt date NOT NULL, author_id bigint(20) NOT NULL,FOREIGN KEY (auth
7、or_id) REFERENCES User(id),PRIMARY KEY (id);# - !DownsDROP TABLE Post;Play將應用這個evolution腳本到A開發(fā)者的數(shù)據(jù)庫。另外一方面,B開發(fā)者因工作需要,必須刪除 User表。因此他也將創(chuàng)建2.sql evolution 腳本:# Update User# - !UpsALTER TABLE User ADD age INT;# - !DownsALTER TABLE User DROP age;B開發(fā)者結(jié)束開發(fā)工作后進行了提交(稱為 Git)?,F(xiàn)在,A開發(fā)者在繼續(xù)開發(fā)前 必須合并他的同事的工作,因此他運行 git
8、pull ,但合并操作產(chǎn)生了一個沖突, 如下:Auto-merging db/evolutions/2.sqlCONFLICT (add/add): Merge conflict in db/evolutions/2.sql Automatic merge failed; fix conflicts and then commit the result.每個開發(fā)者都創(chuàng)建了一個 2.sql evolution 腳本。因此, A 開發(fā)者需要合并這個 文件: devB這個合并操作其實很容易做 :# Add Post and update User# - !UpsALTER TABLE User AD
9、D age INT;CREATE TABLE Post (id bigint(20) NOT NULL AUTO_INCREMENT, title varchar(255) NOT NULL, content text NOT NULL, postedAt date NOT NULL,author_id bigint(20) NOT NULL,FOREIGN KEY (author_id) REFERENCES User(id),PRIMARY KEY (id);# - !DownsALTER TABLE User DROP age;DROP TABLE Post;這個 evolution 腳
10、本顯示為新修訂 revision 2 的數(shù)據(jù)庫,這個版本不同于 A 開 發(fā)者之前已經(jīng)應用的修訂 2 版本。因此 Play 會察覺到這個情況,并要求 A 開發(fā)者通過首先恢復已經(jīng)應用的舊的修 訂 2 版本來同步他的數(shù)據(jù)庫,并應用新的修訂 2 版本腳本:+ * * http:/localhost:9000/Your database needs evolution!An SQL script will be run on your database.This SQL script must be run:fl E WARNING! Thia script contains DOWNS evoluti
11、ons that are likely destructives# - Revi21Downs - lbOf5fDROP TABLE Pest;# Rev:2,Ups ?cf7el2ALTER TABLE User ADD ago INT;CREATE TASLE Post (id bigint(20) NOT NULL AUTO INCREMENTt title varchar(25S) NOT NULL?content text NOT NULL, postedAt date NOT NULL, authorid bigint(20) NOT NULL,FOREIGN KEY (autho
12、r_id) REFERENCES Userid PRIMARY KEY (id);Apply evaluiTcnsThis exception has been logged with id 6S2c0klcd數(shù)據(jù)不一致狀態(tài)某些時候可能會在evolution腳本里犯錯,那么這些腳本就會失效。在這種情況 下,play將標記數(shù)據(jù)庫結(jié)構為數(shù)據(jù)不一致狀態(tài),同時要求你在繼續(xù)工作前手工 解決這個問題。比如,Evolution 腳本的 Ups存在一個錯誤:# Add ano ther colu mn to User# - !UpsALTER TABLE Userxxx ADD compa ny varcha
13、r(255);# - !Dow nsALTER TABLE User DROP compa ny;因此,試著應用這個evolution將導致失敗,play將把數(shù)據(jù)庫結(jié)構標記為incon siste nt:Application error+ t * hnp:/localhost:9000/Your database is an inconsistent state!An evolution has not been applied properly. Please check the problem and resolve it manualThis SQL script has been r
14、un, and there was a problem:# - Rev:3fUps - c0d5el7ALTER TABLE Userxxx ADD conipany varchar (255 ;This error has been thrown:Table * te3t*uscrxxx 1 doosn* t exist (EftROR; 1.146, SQLSTATE* 42S02 )Mark it resotvedThis exception has been logged with id 662cDkld3現(xiàn)在要繼續(xù)工作前,你必須解決這個不一致的問題,因此你就運行了fixed SQL命
15、令:ALTER TABLE User ADD company varchar(255); 之后,通過單擊按鈕,手工解決了這個標記的問題。但是由于你的 evolution 腳本存在錯誤, 你或許希望修復這個錯誤。 因此你修改 了 3.sql 腳本:# Add another column to User# - !UpsALTER TABLE User ADD company varchar(255);# - !DownsALTER TABLE User DROP company;Play 檢測到這個新的 evolution ,然后替換了之前的 3 版, 之后將運行下面的 腳本:+ * * hnp
16、:/localhost:9000/Your database needs evolution!An SQL script will be run on your database.This SQL script must be run:# llJ WARNING E Thia script contains DOWNS evolutions that are likely destructives# - Rev:3 r Downs c0d5cl7ALTER TABLE User DROP company;# Rev:3,Ups L5ed3f5ALTER TABLE User ADD compa
17、ny varchar(255 ;Apply evolutionsThis exception has been logged with id 662c0kld7現(xiàn)在所有的問題都已處理好,你又可以繼續(xù)工作了。在開發(fā)模式里,處理這樣的問題非常簡單,可以直接丟棄現(xiàn)在的開發(fā)數(shù)據(jù)庫, 然 后再次重頭申請所有的evolutio ns腳本即可。Evoluti ons 命令在DEV模式里,evolutions是交互式執(zhí)行的。然而在 PRO模式里,在運行應用 程序前,你就必須使用evolutio ns命令來修訂你的數(shù)據(jù)庫結(jié)構。在生產(chǎn)模式下如果你試著運行一個數(shù)據(jù)庫不是最新版的應用程序時, 應用程序?qū)?不能啟動。
18、_ _ | | | | | _ | |/ _ | | |_| | _/|_|_ (_) |_|_/ play! master-localbuild, framework ID is prod Ctrl+C to stop13:33:22 INFO Starting /test13:33:22 INFO Precompiling .13:33:24 WARN 13:33:24 WARN Your database is not up to date.13:33:24 WARN Use play evoluti ons comma nd to man age database evolutions
19、.13:33:24 ERROR 662c6n234Cant start in PROD mode with errorsYour database needs evolution!An SQL script will be run on your database.play.db.Evolutions$InvalidDatabaseRevisionat play.db.Evolutions.checkEvolutionsState(Evolutions.java:323)at play.db.Evolutions.onApplicationStart(Evolutions.java:197)a
20、t play.Play.start(Play.java:452)at play.Play.init(Play.java:298)at play.server.Server.main(Server.java:141)Exception in thread main play.db.Evolutions$InvalidDatabaseRevision atplay.db.Evolutions.checkEvolutionsState(Evolutions.java:323)at play.db.Evolutions.onApplicationStart(Evolutions.java:197)at
21、 play.Play.start(Play.java:452)at play.Play.init(Play.java:298)at play.server.Server.main(Server.java:141)錯誤消息要求你運行 play evolutions 命令:$ play evolutions _ _ | | | | | _ | |/ _ | | |_| | _/|_|_ (_) |_|_/ play! master-localbuild, framework ID is gbo Application revision is 3 15ed3f5 and Database revision is 0 da39a3e Your database needs evolutions!# - Rev:1,Ups - 6b21167CREATE TABLE User (id bigint(20) NOT NULL AUTO_INCREMENT, email varchar(255) NOT NULL, password varchar(255) NOT NULL, fullname varchar(255) NOT NULL, isAdmin boolean NOT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)合同范本制作
- 口才教室出租合同范本
- 企業(yè)采購合作合同范例
- 以物抵債合同范本
- 冷凍品購銷合同范例
- 合唱排練協(xié)議合同范本
- 周口市安置房買賣合同范例
- 品牌店 轉(zhuǎn)讓 合同范本
- 廠房買賣合同范本模板
- 廚師人工合同范本
- 鋼棧橋施工方案型鋼
- PySide學習教程
- Adobe-Illustrator-(Ai)基礎教程
- 鋼棧橋計算書(excel版)
- 租賃合同審批表
- 事業(yè)單位綜合基礎知識考試題庫 綜合基礎知識考試題庫.doc
- 巖石堅固性和穩(wěn)定性分級表
- 譯林初中英語教材目錄
- 律師事務所函[]第號
- 物業(yè)交付后工程維修工作機制
- 農(nóng)作物病蟲害專業(yè)化統(tǒng)防統(tǒng)治管理辦法
評論
0/150
提交評論