![最新play框架手冊19管理數(shù)據(jù)庫變化evolution資料_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/86f51c0a-90df-4c1f-8dea-5c94b24212e1/86f51c0a-90df-4c1f-8dea-5c94b24212e11.gif)
![最新play框架手冊19管理數(shù)據(jù)庫變化evolution資料_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/86f51c0a-90df-4c1f-8dea-5c94b24212e1/86f51c0a-90df-4c1f-8dea-5c94b24212e12.gif)
![最新play框架手冊19管理數(shù)據(jù)庫變化evolution資料_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/86f51c0a-90df-4c1f-8dea-5c94b24212e1/86f51c0a-90df-4c1f-8dea-5c94b24212e13.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、19.管理數(shù)據(jù)庫變化Evolution當(dāng)使用關(guān)系數(shù)據(jù)庫時(shí),你需要去跟蹤和安排數(shù)據(jù)庫 schema (結(jié)構(gòu))變化,特別 是有多個(gè)存儲位置的情況下,你就需要更多的經(jīng)驗(yàn)來跟蹤數(shù)據(jù)的 schema變化:當(dāng)處理團(tuán)隊(duì)合作進(jìn)行開發(fā)時(shí),每個(gè)人都需要知道數(shù)據(jù)庫結(jié)構(gòu)的變化當(dāng)部署到生產(chǎn)服務(wù)器上時(shí),就需要一個(gè)穩(wěn)健的方式去更新數(shù)據(jù)庫結(jié)構(gòu)如果在多臺數(shù)據(jù)庫服務(wù)器上工作時(shí),就需要保持所有數(shù)據(jù)庫結(jié)構(gòu)同步如果在JPA下工作,Hibernate會自動為你處理好這些數(shù)據(jù)庫變化。如果你不打 算使用JPA或打算手工對數(shù)據(jù)庫結(jié)構(gòu)進(jìn)行更好的調(diào)整,那么Evolutions將非常有用。Evolutio ns腳本Play使用evolutions
2、腳本來跟蹤你的數(shù)據(jù)庫變化。這些腳本采用的是原始的 sql語句來書寫的,應(yīng)該位于應(yīng)用程序的 db/evolutions目錄。第一個(gè)腳本名叫1.sql,第二為2.sql,以此類推每個(gè)腳本包含了兩部分:* Ups部分用于描述必要的轉(zhuǎn)換* Dow ns部分用于描述如何恢復(fù)他們比如,查看第一個(gè)evolution腳本,這個(gè)腳本用于引導(dǎo)一個(gè)基本的應(yīng)用:# 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將被顯示出來。通過設(shè)置 evolutions.enabled為 false可以禁此顯示腳本。比如,當(dāng)測試他們自己的數(shù)據(jù)庫里,你可以為測試環(huán)境設(shè)置 為禁用模式。當(dāng)evoluti
4、ons 被激活后, 在DEV莫式下,Play將為每個(gè)請求檢查數(shù)據(jù)庫結(jié)構(gòu) 狀態(tài),或在PRODS式下啟動應(yīng)用程序時(shí)進(jìn)行數(shù)據(jù)庫結(jié)構(gòu)狀態(tài)檢查。在DEV莫式下,如果數(shù)據(jù)庫結(jié)構(gòu)不是最新的,一個(gè)錯(cuò)誤頁面會顯示出來,它會建議你運(yùn)行合 適的sql腳本同步你的數(shù)據(jù)結(jié)構(gòu)。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腳本,你可以點(diǎn)擊 Apply evolutions 按鈕執(zhí)行該建議 腳本。如果使用的是內(nèi)存數(shù)據(jù)庫 ( db=mem), 并且數(shù)據(jù)庫是空的情況下, Pla
6、y 會自動運(yùn)行 所有的 evolutions 腳本。同步同時(shí)發(fā)生的改變現(xiàn)在讓我們假定現(xiàn)在在同一項(xiàng)目中有兩個(gè)開發(fā)者,A開發(fā)者因工作需要必須創(chuàng)建一個(gè)新的數(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將應(yīng)用這個(gè)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ā)工作后進(jìn)行了提交(稱為 Git)?,F(xiàn)在,A開發(fā)者在繼續(xù)開發(fā)前 必須合并他的同事的工作,因此他運(yùn)行 git
8、pull ,但合并操作產(chǎn)生了一個(gè)沖突, 如下: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.每個(gè)開發(fā)者都創(chuàng)建了一個(gè) 2.sql evolution 腳本。因此, A 開發(fā)者需要合并這個(gè) 文件: devB這個(gè)合并操作其實(shí)很容易做 :# 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;這個(gè) evolution 腳
10、本顯示為新修訂 revision 2 的數(shù)據(jù)庫,這個(gè)版本不同于 A 開 發(fā)者之前已經(jīng)應(yīng)用的修訂 2 版本。因此 Play 會察覺到這個(gè)情況,并要求 A 開發(fā)者通過首先恢復(fù)已經(jīng)應(yīng)用的舊的修 訂 2 版本來同步他的數(shù)據(jù)庫,并應(yīng)用新的修訂 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)某些時(shí)候可能會在evolution腳本里犯錯(cuò),那么這些腳本就會失效。在這種情況 下,play將標(biāo)記數(shù)據(jù)庫結(jié)構(gòu)為數(shù)據(jù)不一致狀態(tài),同時(shí)要求你在繼續(xù)工作前手工 解決這個(gè)問題。比如,Evolution 腳本的 Ups存在一個(gè)錯(cuò)誤:# Add ano ther colu mn to User# - !UpsALTER TABLE Userxxx ADD compa ny varcha
13、r(255);# - !Dow nsALTER TABLE User DROP compa ny;因此,試著應(yīng)用這個(gè)evolution將導(dǎo)致失敗,play將把數(shù)據(jù)庫結(jié)構(gòu)標(biāo)記為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ù)工作前,你必須解決這個(gè)不一致的問題,因此你就運(yùn)行了fixed SQL命
15、令:ALTER TABLE User ADD company varchar(255); 之后,通過單擊按鈕,手工解決了這個(gè)標(biāo)記的問題。但是由于你的 evolution 腳本存在錯(cuò)誤, 你或許希望修復(fù)這個(gè)錯(cuò)誤。 因此你修改 了 3.sql 腳本:# Add another column to User# - !UpsALTER TABLE User ADD company varchar(255);# - !DownsALTER TABLE User DROP company;Play 檢測到這個(gè)新的 evolution ,然后替換了之前的 3 版, 之后將運(yùn)行下面的 腳本:+ * * 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模式里,在運(yùn)行應(yīng)用 程序前,你就必須使用evolutio ns命令來修訂你的數(shù)據(jù)庫結(jié)構(gòu)。在生產(chǎn)模式下如果你試著運(yùn)行一個(gè)數(shù)據(jù)庫不是最新版的應(yīng)用程序時(shí), 應(yīng)用程序?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)錯(cuò)誤消息要求你運(yùn)行 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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度投票權(quán)委托與表決權(quán)代理服務(wù)合同模板
- 索要工資仲裁申請書
- 2025年度文化產(chǎn)業(yè)園區(qū)招商引資合同
- 2025年度光伏電站智能監(jiān)控系統(tǒng)升級合同
- 2025年度互聯(lián)網(wǎng)貸款擔(dān)保服務(wù)合同規(guī)范
- 2025年度數(shù)據(jù)中心建設(shè)項(xiàng)目承包合同
- 專賣店報(bào)銷合同范本
- 冷凍半成品轉(zhuǎn)讓合同范例
- 共享拍攝基地合同范本
- 2025年度品牌形象改造與品牌市場拓展合同
- 數(shù)據(jù)結(jié)構(gòu)英文教學(xué)課件:chapter1 Introduction
- 數(shù)學(xué)-九宮數(shù)獨(dú)100題(附答案)
- 中國農(nóng)業(yè)發(fā)展銀行XX支行 關(guān)于綜合評價(jià)自評情況的報(bào)告
- 2010年宣武區(qū)第六屆中小學(xué)生地理知識競賽題庫
- 人教三年級數(shù)學(xué)下冊表格式全冊
- QC課題提高檢查井周邊壓實(shí)
- 應(yīng)征公民體格檢查表(征兵)
- ACL磁致伸縮液位計(jì)說明書
- 優(yōu)秀教研組評比制度及實(shí)施細(xì)則
- 慈善祖師—太乙救苦天尊經(jīng)文選集拼音版
- 3建筑工程規(guī)劃放線、驗(yàn)線多測合一成果報(bào)告書
評論
0/150
提交評論