python 通過ssh連線資料庫
阿新 • • 發佈:2020-12-29
技術標籤:資料庫
業務場景:
1.平時學習的時候連線資料庫的方法是直接使用pymysql這個模組直接根據ip和埠等進行資料庫的連線;但是在實際工作中資料庫的連線可能還要通過一個跳板機才能連線到對應的資料庫;
2.查閱了一下資料大概是這麼個連線流程,navicat要想連線到資料庫則需要先連線到SSH伺服器,再通過SSH服務去連線到資料庫,而這個SSH伺服器則稱為跳板機;
3. 在python中可以通過模組sshtunnel來進行連線
from sshtunnel import SSHTunnelForwarder
import pymysql
server = SSHTunnelForwarder(
#跳板機IP,跳板機埠號
('ssh_IP','ssh_port'),
ssh_username='testuser',
ssh_password='pwd',
#如果驗證方式是公鑰的話可以使用下面的引數
ssh_pkey='F:/Python_file/Test_work/config/testuser', #私鑰檔案位置
ssh_private_key_password='~w3uCXY3Nc63JsuQ', #私鑰密碼(通行短語)
remote_bind_address=('remote_IP',3306) #遠端資料庫的IP和埠
)
server.start()
#host必須為127.0.0.1,代表本機(堡壘機),user和passwd填的是遠端資料庫的賬號密碼
conn = pymysql.connect(host='127.0.0.1',port=server.local_bind_port,user='remote_user',passwd='remote_pwd',db='data_base')
#建立遊標
cur = conn.cursor()
#執行sql語句
cur.execute('select * from vstore_order_base_info where id=73')
#返回所有結果
res = cur.fetchall()
print(res)
#關閉遊標
cur.close()
#關閉連線
conn.close()
#關閉服務
server.close()
個人使用的封裝
from sshtunnel import SSHTunnelForwarder
from common.get_config import Get_config
import pymysql,json
#連線資訊
ssh = json.loads(Get_config().get_data("mysql","ssh_connect"))
local = json.loads(Get_config().get_data("mysql","local_connect"))
class mysql_connetc():
def __ssh(self,addr,ssh_username,ssh_private_key_password,remote_bind_address,user,passwd):
server = SSHTunnelForwarder(
eval(addr),
ssh_username=ssh_username,
ssh_private_key_password=ssh_private_key_password,
#私鑰檔案位置
ssh_pkey='F:/Python_file/Test_work/config/testuser',
remote_bind_address=eval(remote_bind_address))
return server,user,passwd
#通過ssh連線資料庫
def connect_ssh(self,db,sql,ssh_data=ssh,console_num=0):
"""
:param console_num 查詢結果資料量,預設輸出全部
:param ssh_data 連線ssh的資料,以解包的形式傳入
:param sql sql語句
:param db 連線的資料庫
"""
server,user,passwd = self.__ssh(**ssh_data)
server.start()
conn = pymysql.connect(host='127.0.0.1',port=server.local_bind_port,user=user,passwd=passwd,db=db)
#建立遊標
cur = conn.cursor()
#執行sql
cur.execute(sql)
#輸出結果,console_num控制輸出的查詢結果條數,預設為輸出全部
if console_num == 0:
res = cur.fetchall()
elif console_num == 1:
res = cur.fetchone()
else:
res = cur.fetchmany(console_num)
#關閉服務
cur.close()
conn.close()
server.close()
return res
#直接通過IP進行資料庫連線
def connect_db(self,db,sql,console_num=0,connect_data=local):
host = connect_data["host"]
port = int(connect_data["port"])
user = connect_data["user"]
passwd = connect_data["passwd"]
conn = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db)
cur = conn.cursor()
cur.execute(sql)
# 輸出結果,console_num控制輸出的查詢結果條數,預設為輸出全部
if console_num == 0:
res = cur.fetchall()
elif console_num == 1:
res = cur.fetchone()
else:
res = cur.fetchmany(console_num)
# 關閉服務
cur.close()
conn.close()
return res
Get_config函式中的資料格式