欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴(lài)的問(wèn)題

 更新時(shí)間:2017年12月17日 16:57:19   作者:zhoutk  
這篇文章主要給大家介紹了關(guān)于利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴(lài)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

視圖

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

創(chuàng)建視圖

創(chuàng)建一個(gè)名稱(chēng)為v1的視圖,其功能就是查詢(xún)color表中的所有數(shù)據(jù)

CREATE VIEW v1 AS SELECT * FROM color;

查看視圖

使用視圖時(shí),將其當(dāng)作表進(jìn)行操作即可,由于視圖是虛擬表,所以無(wú)法使用其對(duì)真實(shí)表進(jìn)行創(chuàng)建、更新和刪除操作,僅能做查詢(xún)用。

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)出方面,它是按照視圖名稱(chēng)的字母順序來(lái)處理的,若視圖存在依賴(lài),在導(dǎo)入過(guò)程中就會(huì)報(bào)錯(cuò)。這個(gè)問(wèn)題一直困繞我,一度因?yàn)槲沂褂胐ocker來(lái)部署mysql而繞過(guò)了這個(gè)問(wèn)題。最近不得不直面這個(gè)問(wèn)題,因此,寫(xiě)了一個(gè)小工具來(lái)解決它。

整體思路

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

獲取視圖信息

運(yùn)行以下查詢(xún)語(yǔ)句,就能獲得該數(shù)據(jù)庫(kù)中所有視圖的信息。

select * from information_schema.VIEWS where TABLE_SCHEMA = DatabaseName

查詢(xún)結(jié)果字段說(shuō)明:

  • TABLE_NAME : 數(shù)所庫(kù)中視圖名稱(chēng)
  • VIEW_DEFINITION : 視圖的定義代碼,只有查詢(xún)語(yǔ)句部分
  • DEFINER : 視圖定義(建立)者名稱(chēng)
  • SECURITY : 安全級(jí)別

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

算法描述

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

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

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

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

            若鍵值被第一層元素的定義所依賴(lài)

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

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

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

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

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

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

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

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

                        若第一層元素在鍵值的后

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

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

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

    返回結(jié)果集

上面的說(shuō)明,是按python代碼模式給出的。很幸運(yùn),算法一次就能將復(fù)雜的依賴(lài)關(guān)系處理好了。我在編寫(xiě)的過(guò)程中,剛開(kāi)始依賴(lài)算法不完善時(shí),通過(guò)多次迭代也能處理好復(fù)雜的依賴(lài)關(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í),一開(kāi)始覺(jué)得很麻煩,依賴(lài)關(guān)系若是深層次的,可能一次處理不好,正因?yàn)椴捎玫牡乃枷耄詈蟛磐瓿闪艘淮蔚鉀Q問(wèn)題的完美結(jié)局。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 基于Python 的進(jìn)程管理工具supervisor使用指南

    基于Python 的進(jìn)程管理工具supervisor使用指南

    Supervisor 是基于 Python 的進(jìn)程管理工具,可以輕松管理一些需要以守護(hù)進(jìn)程方式執(zhí)行的程序,也就是后臺(tái)任務(wù),例如用來(lái)啟動(dòng)和管理基于 Tornado 寫(xiě)的 Web 程序。
    2016-09-09
  • python自動(dòng)化報(bào)告的輸出用例詳解

    python自動(dòng)化報(bào)告的輸出用例詳解

    本文通過(guò)用例給大家介紹了python自動(dòng)化報(bào)告的輸出,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-05-05
  • pygame實(shí)現(xiàn)貪吃蛇游戲(上)

    pygame實(shí)現(xiàn)貪吃蛇游戲(上)

    這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 一篇文章帶你了解python字典基礎(chǔ)

    一篇文章帶你了解python字典基礎(chǔ)

    這篇文章主要介紹了Python字典及字典基本操作方法,結(jié)合實(shí)例形式詳細(xì)分析了Python字典的概念、創(chuàng)建、格式化及常用操作方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2021-08-08
  • Python?Numpy庫(kù)的超詳細(xì)教程

    Python?Numpy庫(kù)的超詳細(xì)教程

    Numpy庫(kù)是Python中的一個(gè)科學(xué)計(jì)算庫(kù),本文主要介紹了ndarray的基本操作、?ndarray運(yùn)算等各種Numpy庫(kù)的超詳細(xì)教程,需要的朋友可以參考下
    2022-04-04
  • 關(guān)于PyTorch 自動(dòng)求導(dǎo)機(jī)制詳解

    關(guān)于PyTorch 自動(dòng)求導(dǎo)機(jī)制詳解

    今天小編就為大家分享一篇關(guān)于PyTorch 自動(dòng)求導(dǎo)機(jī)制詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Python繪制線圖之plt.plot()的介紹以及使用

    Python繪制線圖之plt.plot()的介紹以及使用

    在Python中plt.plot是matplotlib庫(kù)中的一個(gè)函數(shù),用于繪制點(diǎn)和線,并對(duì)其樣式進(jìn)行控制,下面這篇文章主要給大家介紹了關(guān)于Python繪制線圖之plt.plot()的介紹以及使用的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • pycharm運(yùn)行scrapy過(guò)程圖解

    pycharm運(yùn)行scrapy過(guò)程圖解

    這篇文章主要介紹了pycharm運(yùn)行scrapy過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 利用python中pymysql操作MySQL數(shù)據(jù)庫(kù)的新手指南

    利用python中pymysql操作MySQL數(shù)據(jù)庫(kù)的新手指南

    PyMySQL是在Python3.x版本中用于連接MySQL服務(wù)器的一個(gè)庫(kù),Python2中是使用mysqldb,這篇文章主要給大家介紹了關(guān)于利用python中pymysql操作MySQL數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • zookeeper python接口實(shí)例詳解

    zookeeper python接口實(shí)例詳解

    這篇文章主要介紹了zookeeper python接口實(shí)例詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01

最新評(píng)論