利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴的問(wèn)題
視圖
視圖是一個(gè)虛擬表(非真實(shí)存在),其本質(zhì)是根據(jù)SQL語(yǔ)句獲取動(dòng)態(tài)的數(shù)據(jù)集,并為其命名,用戶使用時(shí)只需使用名稱即可獲取結(jié)果集,并可以將其當(dāng)作表來(lái)使用。
創(chuàng)建視圖
創(chuàng)建一個(gè)名稱為v1的視圖,其功能就是查詢color表中的所有數(shù)據(jù)
CREATE VIEW v1 AS SELECT * FROM color;
查看視圖
使用視圖時(shí),將其當(dāng)作表進(jìn)行操作即可,由于視圖是虛擬表,所以無(wú)法使用其對(duì)真實(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)出方面,它是按照視圖名稱的字母順序來(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)題,因此,寫了一個(gè)小工具來(lái)解決它。
整體思路
在mysql很容易查出所有視圖和其定義,因此可以寫一個(gè)視圖導(dǎo)出工具,存儲(chǔ)時(shí)對(duì)各視圖的保存位置進(jìn)行調(diào)整,處理好它們之間的依賴關(guān)系,被依賴的放前面,這樣就解決了導(dǎo)入時(shí)的依賴問(wèn)題。
獲取視圖信息
運(yùn)行以下查詢語(yǔ)句,就能獲得該數(shù)據(jù)庫(kù)中所有視圖的信息。
select * from information_schema.VIEWS where TABLE_SCHEMA = DatabaseName
查詢結(jié)果字段說(shuō)明:
- TABLE_NAME : 數(shù)所庫(kù)中視圖名稱
- VIEW_DEFINITION : 視圖的定義代碼,只有查詢語(yǔ)句部分
- 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é)果集
上面的說(shuō)明,是按python代碼模式給出的。很幸運(yùn),算法一次就能將復(fù)雜的依賴關(guān)系處理好了。我在編寫的過(guò)程中,剛開始依賴算法不完善時(shí),通過(guò)多次迭代也能處理好復(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í),一開始覺(jué)得很麻煩,依賴關(guān)系若是深層次的,可能一次處理不好,正因?yàn)椴捎玫牡乃枷?,最后才完成了一次迭代解決問(wèn)題的完美結(jié)局。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
python用tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)易能進(jìn)行隨機(jī)點(diǎn)名的界面
這篇文章主要介紹了python用tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)易能進(jìn)行隨機(jī)點(diǎn)名的界面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
python爬蟲實(shí)現(xiàn)爬取同一個(gè)網(wǎng)站的多頁(yè)數(shù)據(jù)的實(shí)例講解
在本篇文章里小編給大家整理了一篇關(guān)于python爬蟲實(shí)現(xiàn)爬取同一個(gè)網(wǎng)站的多頁(yè)數(shù)據(jù)的實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-01-01
cmd運(yùn)行python文件時(shí)對(duì)結(jié)果進(jìn)行保存的方法
今天小編就為大家分享一篇cmd運(yùn)行python文件時(shí)對(duì)結(jié)果進(jìn)行保存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Python生成驗(yàn)證碼、計(jì)算具體日期是一年中的第幾天實(shí)例代碼詳解
這篇文章主要介紹了Python生成驗(yàn)證碼、計(jì)算具體日期是一年中的第幾天,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
Pandas中df.loc[]與df.iloc[]的用法與異同?
本文主要介紹了Pandas中df.loc[]與df.iloc[]的用法與異同,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧?2022-07-07
使用Python holidays庫(kù)獲取中國(guó)節(jié)日的代碼示例
在軟件開發(fā)中,處理節(jié)假日信息是一個(gè)常見需求,尤其是在進(jìn)行日期計(jì)算、日程安排和自動(dòng)化工作流時(shí),Python 提供了一個(gè)名為??holidays??的庫(kù),它能夠輕松獲取節(jié)假日信息,本文將重點(diǎn)介紹如何使用??holidays??庫(kù)獲取中國(guó)的節(jié)日,并提供詳細(xì)的代碼示例和應(yīng)用場(chǎng)景2024-07-07
Python3環(huán)境安裝Scrapy爬蟲框架過(guò)程及常見錯(cuò)誤
這篇文章主要介紹了Python3環(huán)境安裝Scrapy爬蟲框架過(guò)程及常見錯(cuò)誤 ,本文給大家介紹的非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Django drf使用Django自帶的用戶系統(tǒng)的注冊(cè)功能
本文主要介紹了Django drf使用Django自帶的用戶系統(tǒng)的注冊(cè)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

