• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于Web的數(shù)據(jù)導入工具設計

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

      何怡璇 熊棠 易修文

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

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

      中圖分類號:TP311 ? ? ?文獻標識碼:A

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

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

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

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

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

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

      2 過程分析

      2.1 策略列表

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

      2.2 上傳文件

      不論用戶使用哪種方式,均需上傳源數(shù)據(jù)文件??蛻舳?、服務器端應對文件類型進行過濾,僅接受可識別的文件,如xlsx、csv等。

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

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

      2.4 定義策略

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

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

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

      3 模型設計

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

      3.1 Rule類的屬性

      Rule類用來存儲策略并可再次使用。至少應包含兩個字段。

      3.1.1 title字段

      title字段用于識別策略,便于再次使用。

      3.1.2 pattern字段

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

      3.2 pattern格式

      pattern是整個工具的核心,用來定義如何導入數(shù)據(jù)。

      3.2.1 src

      src鍵值對用來定義數(shù)據(jù)源,即上傳文件中的第幾個工作表,從0開始。

      3.2.2 dest

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

      3.2.3 f_r

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

      3.2.4 map

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

      3.2.4.1 col

      col鍵值對用來定義該位置字段對應的ActiveRecord對象屬性名。

      3.2.4.2 type

      type鍵值對用來定義該位置字段對應的ActiveRecord對象屬性的字段類型。不同的字段類型在導入時會做特定的處理。

      3.2.4.3 not_unique

      not_unique鍵值對用來定義該位置字段對應的值在數(shù)據(jù)庫中是否要求唯一性。

      3.2.4.4 to_rel

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

      3.2.4.5 rel_table

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

      3.2.4.6 rel_col

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

      3.2.4.7 rel_col_type

      rel_col_type鍵值對用來定義該位置字段關(guān)聯(lián)的ActiveRecord對象的對應屬性的字段類型。不同的字段類型在導入時會做特定的處理。

      3.2.4.8 rel_c_rol

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

      3.2.4.9 rel_c_rol_type

      rel_c_rol_type鍵值對用來定義返回對應字段的字段類型。不同的字段類型在導入時會做特定的處理。

      3.2.4.10 rel_not_unique

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

      4 控制與視圖

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

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

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

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

      4.2 編寫策略

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

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

      通過以上準備工作即可建立控制面板,用于編寫策略。

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

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

      4.2.2 字段映射

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

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

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

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

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

      4.2.5 生成策略并提交

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

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

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

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

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

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

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

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

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

      4.3.2 字段映射

      遍歷@src[i]的每一個元素,如@src[i][j],按以下步驟進行導入操作。

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

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

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

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

      4.3.2.3 字段賦值

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

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

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

      4.3.3 構(gòu)造對象實例并保存

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

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

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

      5 結(jié)束語

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

      參考文獻:

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

      [2] 對象關(guān)系映射-維基中文鏡像,自由的百科全書[EB/OL]. [2019-12-20].https://zh.wikipedia.com/wiki/對象關(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ù)據(jù)質(zhì)量控制分析
      不懼于新,不困于形——一道函數(shù)“關(guān)聯(lián)”題的剖析與拓展
      “一帶一路”遞進,關(guān)聯(lián)民生更緊
      奇趣搭配
      智趣
      CNMARC304字段和314字段責任附注方式解析
      無正題名文獻著錄方法評述
      關(guān)于CNMARC的3--字段改革的必要性與可行性研究
      注冊表值被刪除導致文件夾選項成空白
      “掃除”技巧之清除惡意程序
      固阳县| 仪征市| 高陵县| 宜兴市| 河津市| 汪清县| 永昌县| 井研县| 剑川县| 冷水江市| 梨树县| 和田县| 铁岭县| 怀来县| 仁布县| 禹城市| 澄城县| 桂阳县| 辽阳市| 莱芜市| 迭部县| 南宁市| 平远县| 湘乡市| 夹江县| 阳新县| 乃东县| 响水县| 淮北市| 涟水县| 南陵县| 开封市| 焦作市| 新野县| 沙坪坝区| 衢州市| 略阳县| 松江区| 阿瓦提县| 巴彦县| 无极县|