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

Python通過跳板機(jī)訪問數(shù)據(jù)庫的方法

 更新時間:2021年10月28日 16:27:17   作者:幸運的小新粉  
跳板機(jī)是一類可作為跳板批量操作的遠(yuǎn)程設(shè)備的網(wǎng)絡(luò)設(shè)備,是系統(tǒng)管理員和運維人員常用的操作平臺之一。本文給大家介紹Python通過跳板機(jī)訪問數(shù)據(jù)庫的方法,感興趣的朋友跟隨小編一起看看吧

什么是跳板機(jī)?

跳板機(jī)(Jump Server):也稱堡壘機(jī),是一類可作為跳板批量操作的遠(yuǎn)程設(shè)備的網(wǎng)絡(luò)設(shè)備,是系統(tǒng)管理員和運維人員常用的操作平臺之一。
那么具體是做什么的呢?
現(xiàn)在一些比較大的互聯(lián)網(wǎng)企業(yè),往往擁有大量的服務(wù)器,為了能夠統(tǒng)一方便管理,運維人員通過跳板機(jī)去管理對應(yīng)的服務(wù)器。我們在訪問服務(wù)器的時候,先通過登陸跳板機(jī),然后再進(jìn)入相應(yīng)服務(wù)器。從一定程度上提升了服務(wù)器的數(shù)據(jù)安全性,也提升了服務(wù)器的可維護(hù)性。

sshtunnel 連接堡壘機(jī)

跳板機(jī)的本質(zhì)還是ssh連接,通過paramiko 自己造輪子的話理論也是可以實現(xiàn)的,這邊推薦 sshtunnel 這個包,省的自己寫了。
理解了跳板機(jī)的原理,這邊的配置就比較好理解了。拿這張圖舉例,首先需要先訪問跳板機(jī),其實就是最常見的ssh連接,可以是賬戶密碼,也可以是密鑰登錄的,如果是密鑰的話需要在 跳板機(jī)的.ssh 目錄下的某個許可文件中添加上自己的公鑰

建立ssh通道模版

最后還需要補(bǔ)充一下 目標(biāo)主機(jī)的ip 和端口。理解了這些,以下的這些參數(shù)就知道怎么配置了,
local_bind_address 可以不配置,不配置會隨機(jī)獲取本地的端口號,如果指定的話就會占用本地固定的端口號,推薦配置這一參數(shù)。
填寫本地的端口是因為這邊會將目標(biāo)服務(wù)器ip的端口映射為本地端口,然后訪問本地端口就能實現(xiàn)目標(biāo)端口的訪問了。

from sshtunnel import SSHTunnelForwarder
server = SSHTunnelForwarder(
        (host_jump, int(port_jump)),  # 跳板機(jī)的配置
        ssh_pkey=ssh_pk_jump, 
        #密鑰的訪問方式,如果是密碼 ssh_password=???
        ssh_username=user_name_jump,
        remote_bind_address=(host_mysql, int(port_mysql)))  # 數(shù)據(jù)庫服務(wù)器的配置
        local_bind_address=(local_ip, local_port)  # 開啟本地轉(zhuǎn)發(fā)端口
        )
	server.start()
	server.close()

有些人習(xí)慣用 上下文管理器,看起來更舒服些

from sshtunnel import SSHTunnelForwarder
with SSHTunnelForwarder(
        (host_jump, int(port_jump)),  # 跳板機(jī)的配置
        ssh_pkey=ssh_pk_jump, 
        #密鑰的訪問方式,如果是密碼 ssh_password=???
        ssh_username=user_name_jump,
        remote_bind_address=(host_mysql, int(port_mysql)))  # 數(shù)據(jù)庫服務(wù)器的配置
        local_bind_address=(local_ip, local_port)  # 開啟本地轉(zhuǎn)發(fā)端口
        )as server
	server.start()

連接數(shù)據(jù)庫

建立好通道后就能通過本地映射的端口訪問目標(biāo)的數(shù)據(jù)庫端口了。
常見的mysql 數(shù)據(jù)庫訪問 比如 mysqldb,pymysql,mysql.connector,
mysqldb跟 pymysql 差不多,只不過前者適用python2的版本,后者適用python3的版本,mysql.connector是官方推薦的。
pymysql 跟 mysql.connector 還是有一些區(qū)別的
我這邊使用的是 mysql.connector ,在實踐中老是無法連接上,而pymysql卻是可以的。
最終終于找到了解決辦法。。。

在這里插入圖片描述

以下是我的mysql.connector 連接數(shù)據(jù)庫的樣例。

with SSHTunnelForwarder(
        (host_jump, int(port_jump)),  # 跳板機(jī)的配置
        ssh_pkey=ssh_pk_jump, 
        #密鑰的訪問方式,如果是密碼 ssh_password=???
        ssh_username=user_name_jump,
        remote_bind_address=(host_mysql, int(port_mysql)))  # 數(shù)據(jù)庫服務(wù)器的配置
        local_bind_address=(local_ip, local_port)  # 開啟本地轉(zhuǎn)發(fā)端口
        )as server
	server.start()
    conn = mysql.connector.connect(**{'host': '127.0.0.1',
                              'port': server.local_bind_port,
                              'user': dbcfg["user"],
                              'password': dbcfg["password"],
                              'db': dbcfg["db"],
                              'charset': dbcfg["charset"],
                              'collation': dbcfg["collation"],
                              'use_unicode': dbcfg["use_unicode"],
                              'use_pure': True})
        cursor = conn.cursor(dictionary=True)
        cursor.execute(sql, params)
        rows = cursor.fetchall()
        # conn.commit()
        cursor.close()
        conn.close()

這樣,數(shù)據(jù)庫就能正常訪問啦

代碼重構(gòu)和優(yōu)化

首先,就上面這樣的代碼而言,在每次查詢都需要進(jìn)行跳板機(jī)的連接,對于短時間突然大量請求的情況,這種是效率極低的。所以最好是能夠?qū)⒔⒐艿辣4嫦聛怼?br /> 其次,如果同時訪問多種數(shù)據(jù)庫的情況,存在有無跳板機(jī)的場景,所以最好能夠先將所有的數(shù)據(jù)庫都進(jìn)行連接,將conn保存在字典中,根據(jù)要訪問的機(jī)器調(diào)用對應(yīng)的conn,最后再統(tǒng)一釋放。

def get_slave_conn_byProxy(dbcfg):
    server = SSHTunnelForwarder(
        eval(dbcfg["addr"]),
        ssh_username=dbcfg["ssh_username"],
        ssh_pkey=os.getenv("HOME") + "/.ssh/id_rsa",
        remote_bind_address=eval(dbcfg["remote_bind_address"]),
        local_bind_address=eval(dbcfg["local_bind_address"])  # 開啟本地轉(zhuǎn)發(fā)端口
    )
    server.start()
    conn = get_db_connection({'host': '127.0.0.1',
                              'port': server.local_bind_port,
                              'user': dbcfg["user"],
                              'password': dbcfg["password"],
                              'db': dbcfg["db"],
                              'charset': dbcfg["charset"],
                              'collation': dbcfg["collation"],
                              'use_unicode': dbcfg["use_unicode"],
                              'use_pure': True})
    return server, conn

def get_db_connection(dbcfg):
    # logger.info(f"============ debug db config: {dbcfg}")
    conn = mysql.connector.connect(**dbcfg)
    return conn

# 通過輸入的連接參數(shù)判斷是否需要通過跳板機(jī)的方式
def get_slave_conn(dbcfg):
    if "addr" in dbcfg:
        return get_slave_conn_byProxy(dbcfg)
    else:
        conn = get_db_connection(dbcfg)
        return None, conn
       
def read_slave_db_data(sql, conn, params=None, use_pdf=True):
        cursor = conn.cursor(dictionary=True)
        cursor.execute(sql, params)
        rows = cursor.fetchall()
        # conn.commit()
        cursor.close()
        if use_pdf:
            return pd.DataFrame(rows)
        else:
            return rows

到此這篇關(guān)于Python通過跳板機(jī)訪問數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Python跳板機(jī)訪問數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python3+selenium實現(xiàn)qq郵箱登陸并發(fā)送郵件功能

    python3+selenium實現(xiàn)qq郵箱登陸并發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了python3+selenium實現(xiàn)qq郵箱登陸,并發(fā)送郵件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 如何解決Python讀取圖片路徑存在轉(zhuǎn)義字符的問題

    如何解決Python讀取圖片路徑存在轉(zhuǎn)義字符的問題

    這篇文章主要為大家詳細(xì)介紹了如何解決Python讀取圖片路徑時存在轉(zhuǎn)義字符的問題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2023-07-07
  • 解決Linux系統(tǒng)中python matplotlib畫圖的中文顯示問題

    解決Linux系統(tǒng)中python matplotlib畫圖的中文顯示問題

    這篇文章主要介紹了解決Linux系統(tǒng)中python matplotlib畫圖的中文顯示問題,需要的朋友可以參考下
    2017-06-06
  • Python中元組的基礎(chǔ)介紹及常用操作總結(jié)

    Python中元組的基礎(chǔ)介紹及常用操作總結(jié)

    元組是一種不可變序列。元組變量的賦值要在定義時就進(jìn)行,這就像C語言中的const變量或是C++的引用,定義時賦值之后就不允許有修改。元組存在的意義是:元組在映射中可以作為鍵使用,因為要保證鍵的不變性。元組作為很多內(nèi)置函數(shù)和方法的返回值存在
    2021-09-09
  • 提取視頻中的音頻 Python只需要三行代碼!

    提取視頻中的音頻 Python只需要三行代碼!

    這篇文章主要介紹了python 如何提取視頻中的音頻,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-05-05
  • python通過文本在一個圖中畫多條線的實例

    python通過文本在一個圖中畫多條線的實例

    今天小編就為大家分享一篇python通過文本在一個圖中畫多條線的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python?3行代碼提取音樂高潮部分

    Python?3行代碼提取音樂高潮部分

    這篇文章主要介紹了利用Python代碼提取音樂高潮部分,文章圍毆繞Python代碼的相關(guān)詳情展開提取音樂的內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • 教你怎么用Python操作MySql數(shù)據(jù)庫

    教你怎么用Python操作MySql數(shù)據(jù)庫

    很多小伙伴都在問我能不能出一篇怎么用Python操作MySql數(shù)據(jù)庫的教程,今天特地整理了本篇文章,文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下
    2021-05-05
  • Python對FTP交互封裝的實現(xiàn)

    Python對FTP交互封裝的實現(xiàn)

    本文主要介紹了Python對FTP交互封裝的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 淺談Django Admin的初步使用

    淺談Django Admin的初步使用

    本文主要介紹了淺談Django Admin的初步使用 ,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評論