国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用python解決mysql視圖導入導出依賴問題

Brenner / 682人閱讀

摘要:是可視化工具中最棒的,但是,在處理視圖的導入導出方面,它是按照視圖名稱的字母順序來處理的,若視圖存在依賴,在導入過程中就會報錯。

navicat是mysql可視化工具中最棒的,但是,在處理視圖的導入導出方面,它是按照視圖名稱的字母順序來處理的,若視圖存在依賴,在導入過程中就會報錯。這個問題一直困繞我,一度因為我使用docker來部署mysql而繞過了這個問題。最近不得不直面這個問題,因此,寫了一個小工具來解決它。
整體思路

在mysql很容易查出所有視圖和其定義,因此可以寫一個視圖導出工具,存儲時對各視圖的保存位置進行調整,處理好它們之間的依賴關系,被依賴的放前面,這樣就解決了導入時的依賴問題。

獲取視圖信息

運行以下查詢語句,就能獲得該數據庫中所有視圖的信息。

select * from  information_schema.VIEWS where TABLE_SCHEMA = DatabaseName 

查詢結果字段說明:

TABLE_NAME : 數所庫中視圖名稱

VIEW_DEFINITION : 視圖的定義代碼,只有查詢語句部分

DEFINER : 視圖定義(建立)者名稱

SECURITY : 安全級別

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

算法描述

將查詢結果放到dict中,視圖名稱為key;視圖定義為value;

編寫處理依賴關系的函數process_rely,輸入參數中的rely_old為保存所有視圖名稱的數組;返回參數為按依賴關系調整順序后的視圖名稱數組。之所以這樣做,是一開始考慮到,依賴關系復雜時,可能一次迭代處理不好,需要遞歸調用或多次調用。

process_rely函數算法描述:

第一層循環,從rely_old中取一個視圖名稱

第二層循環,從dict中取出一個鍵值

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

若鍵值還不在結果數組中

若第一層元素不在結果數組中

追加鍵值到結果數組中

第一層元素在結果數組中

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

鍵值在結果數組中

第一層元素在結果數組中

查找各自在結果數組中的位置

若第一層元素在鍵值的后

將鍵值移動到第一層元素前

第二層循環結束時,若第一層元素還不在結果集中

將第一層元素追加到結果集中

返回結果集

上面的說明,是按python代碼模式給出的。很幸運,算法一次就能將復雜的依賴關系處理好了。我在編寫的過程中,剛開始依賴算法不完善時,通過多次迭代也能處理好復雜的依賴關系。因此,堅定了必勝的信心,完成了這個任務。

完整代碼
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()
小結

思路要清晰,代碼要一步步的向最終目標靠近,積跬步以至千里。在做這個工具時,一開始覺得很麻煩,依賴關系若是深層次的,可能一次處理不好,正因為采用的迭代的思想,最后才完成了一次迭代解決問題的完美結局。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41059.html

相關文章

  • 宜信開源|數據庫審核軟件Themis部署攻略

    摘要:一介紹是宜信公司團隊開發的一款數據庫審核產品,可幫助開發人員快速發現數據庫質量問題,提升工作效率。此平臺可實現對數據庫進行多維度對象結構文本執行計劃及執行特征的審核,用以評估對象結構設計質量及運行效率。執行計劃指數據庫中的執行計劃。 一、介紹 Themis是宜信公司DBA團隊開發的一款數據庫審核產品,可幫助DBA、開發人員快速發現數據庫質量問題,提升工作效率。其名稱源自希臘神話中的正義...

    fsmStudy 評論0 收藏0

發表評論

0條評論

Brenner

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<