摘要:是可視化工具中最棒的,但是,在處理視圖的導(dǎo)入導(dǎo)出方面,它是按照視圖名稱的字母順序來處理的,若視圖存在依賴,在導(dǎo)入過程中就會(huì)報(bào)錯(cuò)。
navicat是mysql可視化工具中最棒的,但是,在處理視圖的導(dǎo)入導(dǎo)出方面,它是按照視圖名稱的字母順序來處理的,若視圖存在依賴,在導(dǎo)入過程中就會(huì)報(bào)錯(cuò)。這個(gè)問題一直困繞我,一度因?yàn)槲沂褂胐ocker來部署mysql而繞過了這個(gè)問題。最近不得不直面這個(gè)問題,因此,寫了一個(gè)小工具來解決它。整體思路
在mysql很容易查出所有視圖和其定義,因此可以寫一個(gè)視圖導(dǎo)出工具,存儲(chǔ)時(shí)對(duì)各視圖的保存位置進(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 : 安全級(jí)別
總之,所有視圖的信息都在這個(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 + "; ") file_object.write("CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW " + al + " AS " + ps[al] + "; ") file_object.close()小結(jié)
思路要清晰,代碼要一步步的向最終目標(biāo)靠近,積跬步以至千里。在做這個(gè)工具時(shí),一開始覺得很麻煩,依賴關(guān)系若是深層次的,可能一次處理不好,正因?yàn)椴捎玫牡乃枷?,最后才完成了一次迭代解決問題的完美結(jié)局。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41059.html
摘要:一介紹是宜信公司團(tuán)隊(duì)開發(fā)的一款數(shù)據(jù)庫審核產(chǎn)品,可幫助開發(fā)人員快速發(fā)現(xiàn)數(shù)據(jù)庫質(zhì)量問題,提升工作效率。此平臺(tái)可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫進(jìn)行多維度對(duì)象結(jié)構(gòu)文本執(zhí)行計(jì)劃及執(zhí)行特征的審核,用以評(píng)估對(duì)象結(jié)構(gòu)設(shè)計(jì)質(zhì)量及運(yùn)行效率。執(zhí)行計(jì)劃指數(shù)據(jù)庫中的執(zhí)行計(jì)劃。 一、介紹 Themis是宜信公司DBA團(tuán)隊(duì)開發(fā)的一款數(shù)據(jù)庫審核產(chǎn)品,可幫助DBA、開發(fā)人員快速發(fā)現(xiàn)數(shù)據(jù)庫質(zhì)量問題,提升工作效率。其名稱源自希臘神話中的正義...
閱讀 2421·2021-11-25 09:43
閱讀 2935·2021-11-24 09:39
閱讀 3000·2019-08-30 11:10
閱讀 1199·2019-08-29 16:34
閱讀 652·2019-08-29 13:25
閱讀 3407·2019-08-29 11:21
閱讀 2915·2019-08-26 11:39
閱讀 2460·2019-08-26 11:34