99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴的問題
利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴的問題
2018-08-22
收藏

利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴的問題

這篇文章主要給大家介紹了關(guān)于利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴的問題,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
視圖

視圖是一個(gè)虛擬表(非真實(shí)存在),其本質(zhì)是根據(jù)SQL語句獲取動(dòng)態(tài)的數(shù)據(jù)集,并為其命名,用戶使用時(shí)只需使用名稱即可獲取結(jié)果集,并可以將其當(dāng)作表來使用。

創(chuàng)建視圖

創(chuàng)建一個(gè)名稱為v1的視圖,其功能就是查詢color表中的所有數(shù)據(jù)    
CREATE VIEW v1 AS SELECT * FROM color;

查看視圖

使用視圖時(shí),將其當(dāng)作表進(jìn)行操作即可,由于視圖是虛擬表,所以無法使用其對真實(shí)表進(jìn)行創(chuàng)建、更新和刪除操作,僅能做查詢用。    
select * from v1; -- 等于執(zhí)行SELECT * FROM color

輸出結(jié)果
    
+-----+--------+
| nid | title |
+-----+--------+
| 1 | red |
| 2 | yellow |
+-----+--------+
2 rows in set (0.00 sec)

修改視圖    
ALTER VIEW v1 AS SELECT * FROM color WHERE nid = 1;

刪除視圖    
DROP VIEW v1;

引用

navicat是mysql可視化工具中最棒的,但是,在處理視圖的導(dǎo)入導(dǎo)出方面,它是按照視圖名稱的字母順序來處理的,若視圖存在依賴,在導(dǎo)入過程中就會(huì)報(bào)錯(cuò)。這個(gè)問題一直困繞我,一度因?yàn)槲沂褂?a href='/map/docker/' style='color:#000;font-size:inherit;'>docker來部署mysql而繞過了這個(gè)問題。最近不得不直面這個(gè)問題,因此,寫了一個(gè)小工具來解決它。

整體思路

mysql很容易查出所有視圖和其定義,因此可以寫一個(gè)視圖導(dǎo)出工具,存儲(chǔ)時(shí)對各視圖的保存位置進(jìn)行調(diào)整,處理好它們之間的依賴關(guān)系,被依賴的放前面,這樣就解決了導(dǎo)入時(shí)的依賴問題。

獲取視圖信息

運(yùn)行以下查詢語句,就能獲得該數(shù)據(jù)庫中所有視圖的信息。    
select * from information_schema.VIEWS where TABLE_SCHEMA = DatabaseName

查詢結(jié)果字段說明:

    TABLE_NAME : 數(shù)所庫中視圖名稱
    VIEW_DEFINITION : 視圖的定義代碼,只有查詢語句部分
    DEFINER : 視圖定義(建立)者名稱
    SECURITY : 安全級別

總之,所有視圖的信息都在這個(gè)表中保存,我要完成任務(wù),只需要TABLE_NAME和VIEW_DEFINITION就可以了。

算法描述

    將查詢結(jié)果放到dict中,視圖名稱為key;視圖定義為value;
    編寫處理依賴關(guān)系的函數(shù)process_rely,輸入?yún)?shù)中的rely_old為保存所有視圖名稱的數(shù)組;返回參數(shù)為按依賴關(guān)系調(diào)整順序后的視圖名稱數(shù)組。之所以這樣做,是一開始考慮到,依賴關(guān)系復(fù)雜時(shí),可能一次迭代處理不好,需要遞歸調(diào)用或多次調(diào)用。

process_rely函數(shù)算法描述:

    第一層循環(huán),從rely_old中取一個(gè)視圖名稱

        第二層循環(huán),從dict中取出一個(gè)鍵值

            若鍵值被第一層元素的定義所依賴

                若鍵值還不在結(jié)果數(shù)組中

                    若第一層元素不在結(jié)果數(shù)組中

                        追加鍵值到結(jié)果數(shù)組中

                    第一層元素在結(jié)果數(shù)組中

                        將鍵值插入到第一層元素前

                鍵值在結(jié)果數(shù)組中

                    第一層元素在結(jié)果數(shù)組中

                        查找各自在結(jié)果數(shù)組中的位置

                        若第一層元素在鍵值的后

                            將鍵值移動(dòng)到第一層元素前

        第二層循環(huán)結(jié)束時(shí),若第一層元素還不在結(jié)果集中

            將第一層元素追加到結(jié)果集中

    返回結(jié)果集

上面的說明,是按python代碼模式給出的。很幸運(yùn),算法一次就能將復(fù)雜的依賴關(guān)系處理好了。我在編寫的過程中,剛開始依賴算法不完善時(shí),通過多次迭代也能處理好復(fù)雜的依賴關(guān)系。因此,堅(jiān)定了必勝的信心,完成了這個(gè)任務(wù)。
完整代碼    
import pymysql
conn = pymysql.connect(host='172.17.0.1', port=3306, user='root',
      passwd='123456', db='database', charset='utf8mb4')
def process_rely(parmas={}, rely_old=[]):
 _rely = []
 _keys = list(parmas.keys())
 for k in rely_old:
  for bl in _keys:
   if str(parmas[k]).find(bl) > -1:
    if bl not in _rely:
     if k not in _rely:
      _rely.append(bl)
     else:
      i = _rely.index(k)
      _rely.insert(i, bl)
    else:
     if k in _rely:
      i = _rely.index(k)
      j = _rely.index(bl)
      if i < j:
       del _rely[j]
       _rely.insert(i, bl)
  if k not in _rely:
   _rely.append(k)
 return _rely
cur = conn.cursor()
cur.execute('select TABLE_NAME, VIEW_DEFINITION from information_schema.VIEWS where TABLE_SCHEMA = %s ', 'database')
rs = cur.fetchall()
cur.close()
conn.close()
ps = {}
for al in rs:
 ps['`' + al[0] + '`'] = al[1]
rely = process_rely(ps, list(ps.keys()))
# rely = process_rely(ps, rely1)
file_object = open('view.sql', 'w')
for al in rely:
 file_object.write('DROP VIEW IF EXISTS ' + al + ';\n')
 file_object.write('CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW ' + al +
      ' AS ' + ps[al] + ';\n\n')
file_object.close()

小結(jié)

思路要清晰,代碼要一步步的向最終目標(biāo)靠近,積跬步以至千里。在做這個(gè)工具時(shí),一開始覺得很麻煩,依賴關(guān)系若是深層次的,可能一次處理不好,正因?yàn)椴捎玫牡乃枷?,最后才完成了一次迭代解決問題的完美結(jié)局。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }