本發(fā)明涉及數(shù)據(jù)庫技術(shù)領(lǐng)域,特別是涉及一種數(shù)據(jù)庫的數(shù)據(jù)模型更新方法和系統(tǒng)。
背景技術(shù):
ORM(Object-Relation-Mapping,對象關(guān)系映射)框架是采用元數(shù)據(jù)來描述對象一關(guān)系映射細(xì)節(jié),元數(shù)據(jù)一般采用XML格式,并且存放在專門的對象一映射文件中。
現(xiàn)有ORM框架中,如Hibernate可以對數(shù)據(jù)模型的修改進(jìn)行檢測,并自動同步修改數(shù)據(jù)庫結(jié)構(gòu);但由于缺乏回滾和記錄變更的手段,用戶必須手動備份數(shù)據(jù)庫表單,以防升級出錯。
由此,在進(jìn)行數(shù)據(jù)庫遷移、升降級等更新過程中,如果用戶不能及時(shí)備份,則在系統(tǒng)的數(shù)據(jù)模型發(fā)生變化時(shí)就無法記錄數(shù)據(jù)庫的差異和變更記錄,降低了數(shù)據(jù)庫的使用效率。
技術(shù)實(shí)現(xiàn)要素:
基于此,有必要針對上述技術(shù)問題,提供一種數(shù)據(jù)庫的數(shù)據(jù)模型更新方法和系統(tǒng),提高數(shù)據(jù)庫的使用效率。
一種數(shù)據(jù)庫的數(shù)據(jù)模型更新方法,包括:
獲取當(dāng)前數(shù)據(jù)庫的表單數(shù)據(jù),并反向生成對象模型;
讀取新版本數(shù)據(jù)庫的數(shù)據(jù)模型,對比所述對象模型與新版本的數(shù)據(jù)模型的差異,并生成帶版本號的差分腳本;
將所述版本號記錄到預(yù)先創(chuàng)建的數(shù)據(jù)表中;
根據(jù)所述數(shù)據(jù)表記錄的版本號和差分腳本,對數(shù)據(jù)庫的數(shù)據(jù)模型進(jìn)行更新。
一種數(shù)據(jù)庫的數(shù)據(jù)模型更新系統(tǒng),包括:
轉(zhuǎn)換模塊,用于獲取當(dāng)前數(shù)據(jù)庫的表單數(shù)據(jù),并反向生成對象模型;
比對模塊,用于利用數(shù)據(jù)庫工具讀取新版本的數(shù)據(jù)模型,對比所述對象模型與新版本的數(shù)據(jù)模型的差異,并生成帶版本號的差分腳本;
記錄模塊,用于將所述版本號依據(jù)先后順序記錄到預(yù)先創(chuàng)建的數(shù)據(jù)表中;
更新模塊,用于根據(jù)所述數(shù)據(jù)表記錄的版本號和差分腳本,對數(shù)據(jù)庫的數(shù)據(jù)模型進(jìn)行更新。
上述數(shù)據(jù)庫的數(shù)據(jù)模型更新方法和系統(tǒng),將當(dāng)前數(shù)據(jù)庫的表單數(shù)據(jù)反向生成對象模型,將新版本數(shù)據(jù)庫的數(shù)據(jù)模型與對象模型進(jìn)行比對,將模型差異生成帶版本號的差分腳本記錄到預(yù)先創(chuàng)建的數(shù)據(jù)表中,在需要更新時(shí),利用記錄的版本號和差分腳本自動執(zhí)行對數(shù)據(jù)庫的數(shù)據(jù)模型的新。該技術(shù)方案,可以在數(shù)據(jù)模型發(fā)生變化是,記錄數(shù)據(jù)模型的差異和變更記錄,并可以為更新提供便捷的差分腳本,提高數(shù)據(jù)庫的使用效率。
附圖說明
圖1是本發(fā)明實(shí)施例的數(shù)據(jù)庫的數(shù)據(jù)模型更新方法流程圖;
圖2是一個(gè)實(shí)例的生成差分腳本的流程圖;
圖3是本發(fā)明實(shí)施例的數(shù)據(jù)庫的數(shù)據(jù)模型更新系統(tǒng)結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面結(jié)合附圖闡述本發(fā)明的數(shù)據(jù)庫的數(shù)據(jù)模型更新方法和系統(tǒng)的實(shí)施例。
參考圖1所示,圖1是本發(fā)明實(shí)施例的數(shù)據(jù)庫的數(shù)據(jù)模型更新方法流程圖,包括:
S110,獲取當(dāng)前數(shù)據(jù)庫的表單數(shù)據(jù),并反向生成對象模型;
此步驟中,在執(zhí)行數(shù)據(jù)庫的數(shù)據(jù)模型更新時(shí),首先獲取當(dāng)前數(shù)據(jù)庫的表單數(shù)據(jù),根據(jù)原對象模型反向生成數(shù)據(jù)模型,便于對模型之間進(jìn)行代碼比對。
在一個(gè)實(shí)施例中,在反向生成對象模型前,可以使用ORM對象關(guān)系模型建立數(shù)據(jù)庫表單;根據(jù)數(shù)據(jù)庫的連接地址、用戶名和密碼,建立與數(shù)據(jù)庫的連接;
進(jìn)一步的,建立數(shù)據(jù)表,用于記錄數(shù)據(jù)庫的版本號;其中,初始化版本號置為0;創(chuàng)建所述數(shù)據(jù)庫的備份腳本目錄,并生成配置信息。
上述實(shí)施例,通過讀取數(shù)據(jù)庫的配置信息,建立與數(shù)據(jù)庫的連接,然后執(zhí)行數(shù)據(jù)庫的數(shù)據(jù)模型的更新流程。
在一個(gè)實(shí)施例中,S110的反向生成對象模型的步驟,可以包括如下:
調(diào)用數(shù)據(jù)庫引擎驅(qū)動,讀取當(dāng)前數(shù)據(jù)庫的表單數(shù)據(jù),根據(jù)表單數(shù)據(jù)進(jìn)行代碼轉(zhuǎn)換,反向生成對象模型;具體的,獲取所述表單數(shù)據(jù)中的名稱和字段,對所述名稱和字段進(jìn)行排序,將所述名稱和字段轉(zhuǎn)換成代碼。
S120,讀取新版本數(shù)據(jù)庫的數(shù)據(jù)模型,對比所述對象模型與新版本的數(shù)據(jù)模型的差異,并生成帶版本號的差分腳本;
此步驟中,可以利用數(shù)據(jù)庫工具(如sqlalchemy)讀取新版本數(shù)據(jù)庫的數(shù)據(jù)模型,
由于新的數(shù)據(jù)模型位于系統(tǒng)代碼中,可以加載新舊版本的數(shù)據(jù)模型進(jìn)行差異對比。
在一個(gè)實(shí)施例中,生成帶版本號的差分腳本的步驟,可以將所述對象模型和新版本的數(shù)據(jù)模型中的每個(gè)元數(shù)據(jù)進(jìn)行對比;根據(jù)所述元數(shù)據(jù)的字段差異,生成差分腳本及其版本號。
S130,將所述版本號記錄到預(yù)先創(chuàng)建的數(shù)據(jù)表中;
此步驟中,通過在數(shù)據(jù)庫中新增數(shù)據(jù)表,從而實(shí)現(xiàn)對數(shù)據(jù)庫表單變更的版本控制,是對數(shù)據(jù)庫進(jìn)行更新的前提;例如,可以在預(yù)先創(chuàng)建的數(shù)據(jù)表中,在原版本號基礎(chǔ)上將版本號加1。
S140,根據(jù)所述數(shù)據(jù)表記錄的版本號和差分腳本,對數(shù)據(jù)庫的數(shù)據(jù)模型進(jìn)行更新;
此步驟中,利用數(shù)據(jù)表記錄的版本號和差分腳本,可以對數(shù)據(jù)庫模型進(jìn)行更新,例如數(shù)據(jù)庫的升降機(jī)操作,同時(shí)可以確保在更新過程當(dāng)中的差異和變更記錄。
參考圖2所示,圖2是一個(gè)實(shí)例的生成差分腳本的流程圖,首先建立與數(shù)據(jù)庫的連接,然后調(diào)用數(shù)據(jù)庫引擎驅(qū)動器,將數(shù)據(jù)庫變動數(shù)據(jù)反向生成對象模型與新版本的數(shù)據(jù)模型比對后,得到模型的差異,生成數(shù)據(jù)庫腳本,保存為差分腳本。
在一個(gè)實(shí)施例中,所述更新操作為降級操作;對應(yīng)的,所述步驟S140中具體的降級操作可以如下:
讀取所述數(shù)據(jù)表中記錄的最新的版本號;
查找所述最新的版本號的上一個(gè)版本號對應(yīng)的差分腳本;
執(zhí)行所述上一個(gè)版本號中的降級函數(shù),將數(shù)據(jù)庫的數(shù)據(jù)模型降級到上一個(gè)版本;其中,所述降級函數(shù)記錄從數(shù)據(jù)庫表單從新版本到舊版本的操作。
上述實(shí)施例中,通過數(shù)據(jù)表記錄的最新的版本號,在降級的過程中,通過版本號減1后,找到對應(yīng)的差分腳本,運(yùn)行降級函數(shù),即可恢復(fù)到相應(yīng)版本的數(shù)據(jù)模型。
在一個(gè)實(shí)施例中,所述更新操作為升級操作;對應(yīng)的,所述步驟S140中具體的升級操作可以如下:
讀取所述數(shù)據(jù)表中記錄的最新的版本號;
根據(jù)所述最新的版本號查找對應(yīng)的差分腳本;
執(zhí)行所述差分腳本中的升級函數(shù),將數(shù)據(jù)庫的數(shù)據(jù)模型升級到最新版本;其中,所述升級函數(shù)記錄從數(shù)據(jù)庫表單從舊版本到新版本的操作。
上述實(shí)施例中,在進(jìn)行數(shù)據(jù)庫的升級前,將要升級到的版本的數(shù)據(jù)模型與記錄在數(shù)據(jù)表中的最新版本的數(shù)據(jù)模型進(jìn)行差異比對,然后將兩者差異生成差分腳本及其版本號,并將該版本號記錄在數(shù)據(jù)表中,以供后續(xù)進(jìn)行更新時(shí)使用。
本發(fā)明的技術(shù),可以應(yīng)用在軟件開發(fā)過程中,特別是具備ORM的WEB框架中,在數(shù)據(jù)庫的對象模型發(fā)生改變之后,自動對比原數(shù)據(jù)模型和新的數(shù)據(jù)模型,當(dāng)模型不一致時(shí),可以動態(tài)修改數(shù)據(jù)庫字段;在數(shù)據(jù)模型新增字段,不影響原數(shù)據(jù)庫中數(shù)據(jù),僅進(jìn)行新增字段的操作;數(shù)據(jù)庫進(jìn)行升級之前,可以自動把前后數(shù)據(jù)模型的差異記錄為SQL差分腳本并保存;在進(jìn)行升降級時(shí),可分別執(zhí)行升級腳本和降級腳本對數(shù)據(jù)庫結(jié)構(gòu)進(jìn)行覆蓋和修改;另外,數(shù)據(jù)模型和升降級腳本(如Class類和方法)可以使用Python通用庫生成,可任意移植并轉(zhuǎn)化成其他語言的數(shù)據(jù)模型。
綜合上述實(shí)施例的方案,本發(fā)明的數(shù)據(jù)庫的數(shù)據(jù)模型更新方法,具有如下優(yōu)點(diǎn):
(1)設(shè)計(jì)了數(shù)據(jù)庫表單版本控制的方案;通過在數(shù)據(jù)表單中引進(jìn)版本的概念,新增記錄版本號的數(shù)據(jù)表單,表單名可以記為“version”從而實(shí)現(xiàn)對數(shù)據(jù)庫表單變更的版本控制。
(2)通過數(shù)據(jù)庫引擎驅(qū)動器,配置文件指定連接的數(shù)據(jù)庫類型,對于連接不同類型的數(shù)據(jù)庫,可以通過提供不同的參數(shù)類型,例如URL、用戶名或密碼等組合,使用不同的SQL語句;數(shù)據(jù)庫引擎驅(qū)動器采用基于SQLalchemy實(shí)現(xiàn)的一種多數(shù)據(jù)庫支持的庫,使得在工作的時(shí)候,可以跨越不同的數(shù)據(jù)庫系統(tǒng),例如Mysql,Sqlite等。
(3)在進(jìn)行升降級時(shí),反向生成數(shù)據(jù)模型,并與新的數(shù)據(jù)模型進(jìn)行差異對比,自動生成升降級的差分腳本,并將差分腳本名稱以版本號作為標(biāo)識,例如,可以記為“如0001_migrateion.**”以便升降級使用;
借助SQLalchemy庫可以反向生成數(shù)據(jù)模型,差異對比新舊的數(shù)據(jù)模型,生成相應(yīng)的升降級腳本函數(shù)。
參考圖3所示,圖3是本發(fā)明實(shí)施例的數(shù)據(jù)庫的數(shù)據(jù)模型更新系統(tǒng)結(jié)構(gòu)示意圖,主要包括:
轉(zhuǎn)換模塊110,用于獲取當(dāng)前數(shù)據(jù)庫的表單數(shù)據(jù),并反向生成對象模型;
比對模塊120,用于利用數(shù)據(jù)庫工具讀取新版本的數(shù)據(jù)模型,對比所述對象模型與新版本的數(shù)據(jù)模型的差異,并生成帶版本號的差分腳本;
記錄模塊130,用于將所述版本號依據(jù)先后順序記錄到預(yù)先創(chuàng)建的數(shù)據(jù)表中;
更新模塊140,用于根據(jù)所述數(shù)據(jù)表記錄的版本號和差分腳本,對數(shù)據(jù)庫的數(shù)據(jù)模型進(jìn)行更新。
本發(fā)明的數(shù)據(jù)庫的數(shù)據(jù)模型更新系統(tǒng)與本發(fā)明的數(shù)據(jù)庫的數(shù)據(jù)模型更新方法一一對應(yīng),在上述數(shù)據(jù)庫的數(shù)據(jù)模型更新方法的實(shí)施例闡述的技術(shù)特征及其有益效果均適用于數(shù)據(jù)庫的數(shù)據(jù)模型更新系統(tǒng)的實(shí)施例中,特此聲明。
以上所述實(shí)施例的各技術(shù)特征可以進(jìn)行任意的組合,為使描述簡潔,未對上述實(shí)施例中的各個(gè)技術(shù)特征所有可能的組合都進(jìn)行描述,然而,只要這些技術(shù)特征的組合不存在矛盾,都應(yīng)當(dāng)認(rèn)為是本說明書記載的范圍。
以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。