国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Web的數(shù)據(jù)導(dǎo)入工具設(shè)計(jì)

2020-09-29 07:51:13何怡璇熊棠易修文
電腦知識(shí)與技術(shù) 2020年17期
關(guān)鍵詞:鍵值字段關(guān)聯(lián)

何怡璇 熊棠 易修文

摘要:在Linux系統(tǒng)中,使用Ruby on Rails 5框架設(shè)計(jì)一個(gè)基于Web的數(shù)據(jù)導(dǎo)入工具。將Excel數(shù)據(jù)導(dǎo)入任意數(shù)據(jù)庫(kù)中,并可定義導(dǎo)入策略。

關(guān)鍵詞:數(shù)據(jù)導(dǎo)入;Ruby on Rails 5

中圖分類號(hào):TP311 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A

文章編號(hào):1009-3044(2020)17-0046-03

數(shù)據(jù)的批量導(dǎo)入是系統(tǒng)設(shè)計(jì)和使用中經(jīng)常都會(huì)遇到的問(wèn)題,特別是采用Excel工具收集和處理之后的數(shù)據(jù),如何導(dǎo)入至業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫(kù)并能正確應(yīng)用于系統(tǒng),是系統(tǒng)設(shè)計(jì)人員必須考慮的。使用數(shù)據(jù)庫(kù)管理工具進(jìn)行數(shù)據(jù)導(dǎo)入對(duì)操作人員技能有較高要求,且存在數(shù)據(jù)安全風(fēng)險(xiǎn)。同時(shí),部分?jǐn)?shù)據(jù)還存在不同表之間的關(guān)聯(lián)需求,使用數(shù)據(jù)庫(kù)管理工具導(dǎo)入就需要對(duì)這樣的數(shù)據(jù)進(jìn)行預(yù)先處理,或者編寫SQL語(yǔ)句實(shí)現(xiàn)。

這就提出一個(gè)需求,設(shè)計(jì)一個(gè)Web界面的數(shù)據(jù)導(dǎo)入工具,具有界面友好、可定制保存策略、可視化、支持關(guān)聯(lián)表等功能,以滿足一般用戶的使用需求。

在Linux系統(tǒng)中,使用Ruby on Rails 5框架設(shè)計(jì)一個(gè)數(shù)據(jù)導(dǎo)入工具,使其具有上述功能特定。

1 系統(tǒng)環(huán)境

Ruby on Rails 5框架本身支持Windows、Linux、MacOS等系統(tǒng)環(huán)境,且使用對(duì)象關(guān)系映射(ORM)技術(shù)實(shí)現(xiàn)了數(shù)據(jù)庫(kù)類型不可知[1],在代碼編寫時(shí)注意避免直接使用SQL語(yǔ)句,就能實(shí)現(xiàn)一套系統(tǒng)在不同數(shù)據(jù)庫(kù)之間的自由轉(zhuǎn)換[2]。測(cè)試環(huán)境為Ubuntu16.04操作系統(tǒng),Rails 5.2.3,MySQL 5.7數(shù)據(jù)庫(kù)。

2 過(guò)程分析

2.1 策略列表

用戶應(yīng)可看到之前已保存的策略列表,可選擇根據(jù)已有策略導(dǎo)入或者新建策略。

2.2 上傳文件

不論用戶使用哪種方式,均需上傳源數(shù)據(jù)文件。客戶端、服務(wù)器端應(yīng)對(duì)文件類型進(jìn)行過(guò)濾,僅接受可識(shí)別的文件,如xlsx、csv等。

2.3 讀取數(shù)據(jù)

文件上傳之后,應(yīng)讀取出文件中的數(shù)據(jù),并顯示。如果文件有多個(gè)工作表,應(yīng)顯示出來(lái),并支持人工選擇。

2.4 定義策略

如使用已有策略,應(yīng)將策略展示在頁(yè)面上并支持修改;如為新建策略,應(yīng)支持可視化定義策略并支持自動(dòng)匹配。新建策略及修改策略應(yīng)保持UI的一致性。

2.5 保存策略并導(dǎo)入數(shù)據(jù)

新建策略應(yīng)可選擇是否保存,使用已有策略且發(fā)生策略更改時(shí),應(yīng)更新并持久化。不論策略是否保存,均應(yīng)按當(dāng)前策略導(dǎo)入數(shù)據(jù)并持久化。

3 模型設(shè)計(jì)

策略需要持久化保存,創(chuàng)建Rule類用來(lái)保存策略。

3.1 Rule類的屬性

Rule類用來(lái)存儲(chǔ)策略并可再次使用。至少應(yīng)包含兩個(gè)字段。

3.1.1 title字段

title字段用于識(shí)別策略,便于再次使用。

3.1.2 pattern字段

pattern字段用于存儲(chǔ)策略文本。策略為JSON格式的文本數(shù)據(jù),利于在前端、應(yīng)用層中保持一致性,且便于存儲(chǔ)。

3.2 pattern格式

pattern是整個(gè)工具的核心,用來(lái)定義如何導(dǎo)入數(shù)據(jù)。

3.2.1 src

src鍵值對(duì)用來(lái)定義數(shù)據(jù)源,即上傳文件中的第幾個(gè)工作表,從0開(kāi)始。

3.2.2 dest

dest鍵值對(duì)用來(lái)定義數(shù)據(jù)目的,即系統(tǒng)中對(duì)應(yīng)的ActiveRecord對(duì)象。

3.2.3 f_r

部分文件第一行為表頭。第一行是表頭還是數(shù)據(jù)應(yīng)交由用戶判斷,f_r鍵值對(duì)用來(lái)定義第一行是否為表頭。

3.2.4 map

map鍵值對(duì)用來(lái)定義源數(shù)據(jù)中的字段與ActiveRecord對(duì)象各屬性的映射關(guān)系。因存在多個(gè)字段,其值為一個(gè)數(shù)組。數(shù)組的每個(gè)元素均為多個(gè)鍵值對(duì)組成的JSON格式對(duì)象。

3.2.4.1 col

col鍵值對(duì)用來(lái)定義該位置字段對(duì)應(yīng)的ActiveRecord對(duì)象屬性名。

3.2.4.2 type

type鍵值對(duì)用來(lái)定義該位置字段對(duì)應(yīng)的ActiveRecord對(duì)象屬性的字段類型。不同的字段類型在導(dǎo)入時(shí)會(huì)做特定的處理。

3.2.4.3 not_unique

not_unique鍵值對(duì)用來(lái)定義該位置字段對(duì)應(yīng)的值在數(shù)據(jù)庫(kù)中是否要求唯一性。

3.2.4.4 to_rel

to_rel鍵值對(duì)用來(lái)定義該位置字段對(duì)應(yīng)的值是否存在表關(guān)聯(lián)。如此值為false,則以下幾個(gè)鍵值對(duì)可以不做定義。

3.2.4.5 rel_table

rel_table鍵值對(duì)用來(lái)定義該位置字段關(guān)聯(lián)表的ActiveRecord對(duì)象名。

3.2.4.6 rel_col

rel_col鍵值對(duì)用來(lái)定義該位置字段關(guān)聯(lián)的ActiveRecord對(duì)象的對(duì)應(yīng)屬性。

3.2.4.7 rel_col_type

rel_col_type鍵值對(duì)用來(lái)定義該位置字段關(guān)聯(lián)的ActiveRecord對(duì)象的對(duì)應(yīng)屬性的字段類型。不同的字段類型在導(dǎo)入時(shí)會(huì)做特定的處理。

3.2.4.8 rel_c_rol

rel_c_rol鍵值對(duì)用來(lái)定義建立表關(guān)聯(lián)時(shí)返回的字段。

3.2.4.9 rel_c_rol_type

rel_c_rol_type鍵值對(duì)用來(lái)定義返回對(duì)應(yīng)字段的字段類型。不同的字段類型在導(dǎo)入時(shí)會(huì)做特定的處理。

3.2.4.10 rel_not_unique

rel_not_unique鍵值對(duì)用來(lái)定義該位置字段關(guān)聯(lián)的ActiveRecord對(duì)象的對(duì)應(yīng)屬性值在數(shù)據(jù)庫(kù)中是否要求唯一性。

4 控制與視圖

文件上傳之后,控制器調(diào)用組件讀取文件內(nèi)容。

4.1 讀取源數(shù)據(jù)

使用開(kāi)源Gem Roo執(zhí)行所有常見(jiàn)的電子表格類型的讀訪問(wèn)權(quán)限,包括Excel、LibreOffice、OpenOffice、CSV、Google spreadsheets等格式[3]。

對(duì)于Excel 2013文件,使用Roo::Excelx.new((服務(wù)器端文件路徑))可以讀出文件中的數(shù)據(jù)內(nèi)容賦值給實(shí)例@data_src,并可按工作表進(jìn)行訪問(wèn)。@data_src.sheets以數(shù)組形式輸出各工作表名; @data_src.sheet(i).parse()可將第i個(gè)工作表以數(shù)組形式輸出,如該表沒(méi)有數(shù)據(jù),則輸出nil。

4.2 編寫策略

為了便于對(duì)策略進(jìn)行可視化編寫,首先需要把讀取的源數(shù)據(jù)按工作表以Table樣式輸出在頁(yè)面上。如果數(shù)據(jù)量較大,可部分輸出。

通過(guò)ApplicationRecord類的descendants方法可以獲得系統(tǒng)已有的ActiveRecord對(duì)象及屬性列表。

通過(guò)以上準(zhǔn)備工作即可建立控制面板,用于編寫策略。

4.2.1 數(shù)據(jù)源及目的表

采用下拉菜單的方式選擇源數(shù)據(jù)及目的表。源數(shù)據(jù)即文件中的第幾個(gè)工作表,目的表即數(shù)據(jù)要以哪個(gè)ActiveRecord對(duì)象導(dǎo)入數(shù)據(jù)庫(kù)。同時(shí)要有首行導(dǎo)入選項(xiàng)。

4.2.2 字段映射

當(dāng)數(shù)據(jù)源、目的表選定之后,根據(jù)數(shù)據(jù)源數(shù)組的列數(shù)生成對(duì)應(yīng)選項(xiàng)下拉菜單。當(dāng)“第一行包含標(biāo)題”復(fù)選框未選中時(shí),按Excel習(xí)慣,按字母標(biāo)識(shí)列;當(dāng)前述復(fù)選框被選中時(shí),應(yīng)根據(jù)名稱進(jìn)行自動(dòng)對(duì)應(yīng)。默認(rèn)狀態(tài)下字段導(dǎo)入是允許重復(fù)的。

4.2.3 關(guān)聯(lián)表

當(dāng)對(duì)應(yīng)字段的“關(guān)聯(lián)表”選項(xiàng)被選中時(shí),將出現(xiàn)更多選項(xiàng)。目標(biāo)表即被關(guān)聯(lián)的表,目標(biāo)域即數(shù)據(jù)將要被導(dǎo)入的域。默認(rèn)狀態(tài)下字段導(dǎo)入是不允許重復(fù)的,返回的值為id;通過(guò)打開(kāi)更多選項(xiàng),能對(duì)上述兩個(gè)設(shè)定進(jìn)行修改。當(dāng)選擇返回域時(shí),應(yīng)根據(jù)原目標(biāo)表目標(biāo)域的類型進(jìn)行限制,防止因用戶操作失誤造成數(shù)據(jù)類型不匹配。

4.2.4 數(shù)據(jù)類型

數(shù)據(jù)類型是根據(jù)ActiveRecord對(duì)象讀取,不能被人為控制。

4.2.5 生成策略并提交

頁(yè)面上有一個(gè)隱藏的表單元素pattern_text,值為pattern的JSON格式文本。

為了統(tǒng)一新建與編輯策略時(shí)的腳本,應(yīng)在頁(yè)面載入時(shí)使用JSON.parse方法將pattern_text的值序列化為JSON實(shí)例pattern;若pattern_text的值為空或不是JSON格式文本,將其賦值為“{}”后再執(zhí)行前述操作。生成前述選項(xiàng)時(shí),如果pattern相應(yīng)的值為null或undefined,則按默認(rèn)值生成;否則讀入該值,并按值設(shè)置。

完成設(shè)置后,點(diǎn)擊“導(dǎo)入”按鈕,再次運(yùn)行策略生成腳本,根據(jù)各控件的值對(duì)pattern相應(yīng)的鍵值對(duì)賦值;然后使用JSON.stringify方法將pattern轉(zhuǎn)化為字符串并賦值給pattern_text,然后提交后臺(tái)保存。為了便于日后再次調(diào)用,此處應(yīng)設(shè)置保存選項(xiàng)。

4.3 數(shù)據(jù)持久化

策略文本提交到后臺(tái),如要保存為模板,則按Rule類保存。

策略在被使用前,需要再次序列化為JSON對(duì)象。JSON的統(tǒng)一規(guī)則使前/后端保持了很好的統(tǒng)一性。

依然使用Roo得到的數(shù)組,并根據(jù)pattern[“src”]的值獲得需要導(dǎo)入的數(shù)據(jù)數(shù)組@src。對(duì)@src進(jìn)行遍歷,每一個(gè)元素存為一條數(shù)據(jù)庫(kù)中的記錄。遍歷時(shí)根據(jù)pattern[“f_r”]的值決定是否導(dǎo)入@src[0]。

4.3.1 構(gòu)造參數(shù)散列式

構(gòu)造一個(gè)空散列式_params = {}用來(lái)記錄參數(shù)。

4.3.2 字段映射

遍歷@src[i]的每一個(gè)元素,如@src[i][j],按以下步驟進(jìn)行導(dǎo)入操作。

4.3.2.1 是否關(guān)聯(lián)

讀取pattern[“map”][j][“to_rel”],如非,則直接導(dǎo)入,否則按關(guān)聯(lián)導(dǎo)入并返回值導(dǎo)入。

4.3.2.2 關(guān)聯(lián)導(dǎo)入

根據(jù)pattern[“map”][j][“rel_table”]、pattern[“map”][j][“rel_col”]確定ActiveRecord對(duì)象及字段,如pattern[“map”][j][“rel_not_unique”]為否,則按字段、值搜索,如有結(jié)果,則返回對(duì)象實(shí)例@rel;否則按pattern[“map”][j][“rel_table”]新建ActiveRecord對(duì)象實(shí)例@rel,并賦值保存。最后返回 @rel.attributes[pattern[“map”][j][“rel_c_rol”]]的值_value。

4.3.2.3 字段賦值

不管是直接導(dǎo)入還是關(guān)聯(lián),都牽涉到字段賦值。目標(biāo)字段根據(jù)pattern[“map”][j][“col”]、pattern[“map”][j][“rel_col”]確定,值需要根據(jù)pattern[“map”][j][“type”]、pattern[“map”][j][“rel_col_ type”]進(jìn)行預(yù)先處理。如轉(zhuǎn)換成字符串型、浮點(diǎn)型、日期型等。如為關(guān)聯(lián)導(dǎo)入按前述執(zhí)行得到值_value,否則將處理之后的值賦為_(kāi)value。

4.3.2.4 更新參數(shù)散列式

使用merge方法將{ pattern[“map”][j][“col”].to_sym => _vlue}合并入_params,至此則完成了一個(gè)字段的處理。

4.3.3 構(gòu)造對(duì)象實(shí)例并保存

根據(jù)pattern[“dest”]獲取ActiveRecord對(duì)象,使用create方法和_params參數(shù)執(zhí)行存儲(chǔ)。至此一條完成的記錄按策略完成了導(dǎo)入。

4.4 根據(jù)策略模板導(dǎo)入

前述策略如果保存為模板,可以再次使用,上傳文件后讀取模板中的策略,并按策略設(shè)置控制面板。系統(tǒng)應(yīng)可檢查提交后的模板策略是否應(yīng)被更新并安最新策略執(zhí)行導(dǎo)入。

5 結(jié)束語(yǔ)

該工具能夠?qū)崿F(xiàn)可視化定制、保存策略,并支持表關(guān)聯(lián),達(dá)到了設(shè)計(jì)要求。但還存在只能單字段關(guān)聯(lián),不支持多個(gè)字段確定表關(guān)聯(lián)的問(wèn)題,將在后續(xù)進(jìn)行改進(jìn)。

參考文獻(xiàn):

[1] Active Record 基礎(chǔ)[EB/OL].[2019-12-20].https://ruby-china.github.io/rails-guides/active_record_basics.html.

[2] 對(duì)象關(guān)系映射-維基中文鏡像,自由的百科全書(shū)[EB/OL]. [2019-12-20].https://zh.wikipedia.com/wiki/對(duì)象關(guān)系映射.

[3] Documentation for roo (2.8.3) [EB/OL]. [2019-12-20].https://www.rubydoc.info/gems/roo/2.8.3.

【通聯(lián)編輯:謝媛媛】

猜你喜歡
鍵值字段關(guān)聯(lián)
圖書(shū)館中文圖書(shū)編目外包數(shù)據(jù)質(zhì)量控制分析
“苦”的關(guān)聯(lián)
非請(qǐng)勿進(jìn) 為注冊(cè)表的重要鍵值上把“鎖”
奇趣搭配
一鍵直達(dá) Windows 10注冊(cè)表編輯高招
智趣
讀者(2017年5期)2017-02-15 18:04:18
CNMARC304字段和314字段責(zé)任附注方式解析
無(wú)正題名文獻(xiàn)著錄方法評(píng)述
關(guān)于CNMARC的3--字段改革的必要性與可行性研究
語(yǔ)言學(xué)與修辭學(xué):關(guān)聯(lián)與互動(dòng)
孝昌县| 抚远县| 台州市| 宁武县| 新源县| 江达县| 图们市| 兴文县| 离岛区| 京山县| 同心县| 新野县| 长垣县| 道孚县| 金寨县| 邓州市| 临安市| 汉沽区| 边坝县| 黄石市| 宿松县| 宁波市| 温宿县| 织金县| 大悟县| 洛浦县| 锡林郭勒盟| 张北县| 铜梁县| 南昌县| 南通市| 黄平县| 新和县| 萝北县| 蒙山县| 吉木萨尔县| 桐乡市| 望都县| 宣汉县| 应城市| 陵川县|