日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库

發布時間:2023/12/10 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

安全起見,數據庫的訪問多半是要做限制的,所以就有一個直接的問題是,往往多數時候,在別的機器上(比如自己本地),是不能訪問數據庫的,給日常使用造成了很大不便。所以前幾天做了個需求,是希望在任何機器上都可以ssh到某臺在數據庫白名單的機器上,然后訪問數據庫。

經人推薦,查詢了一個工具叫sshtunnel ,需要在你想要登錄數據庫的機器上安裝。

sshtunnel的基本介紹 :?http://sshtunnel.readthedocs.io/en/latest/?badge=latest

這里邊的圖2,正好是我們描述的場景,數據庫在遠程某臺服務器上,只能同在一起的另一臺服務器才能訪問,但是我們本地就需要ssh到這臺服務器上

?

但是這個里邊涉及到的代碼是服務器相關,遠程連接的是服務器,我們需要的是遠程服務器的數據庫,這個也一樣,只需要變更代碼中后半部分就可以了。

原代碼是下邊這樣:

1 import paramiko 2 from sshtunnel import SSHTunnelForwarder 3 4 with SSHTunnelForwarder( 5 (REMOTE_SERVER_IP, 443), 6 ssh_username="", 7 ssh_pkey="/var/ssh/rsa_key", 8 ssh_private_key_password="secret", 9 remote_bind_address=(PRIVATE_SERVER_IP, 22), 10 local_bind_address=('0.0.0.0', 10022) 11 ) as tunnel: 12 client = paramiko.SSHClient() 13 client.load_system_host_keys() 14 client.set_missing_host_key_policy(paramko.AutoAddPolicy()) 15 client.connect('127.0.0.1', 10022) 16 # do some operations with client session 17 client.close() 18 19 print('FINISH!')

連接mysql數據庫

連接mysql數據庫的時候,看到網上有一位程序員已經實現了:?python 使用mysqldb模塊通過ssh隧道連接mysql

代碼如下:

1 import MySQLdb 2 from sshtunnel import SSHTunnelForwarder 3 4 with SSHTunnelForwarder( 5 ('sshhost.domain.com', 22), #B機器的配置 6 ssh_password="sshpasswd", 7 ssh_username="sshusername", 8 remote_bind_address=('mysqlhost.domain.com', mysql.port)) as server: #A機器的配置 9 10 conn = MySQLdb.connect(host='127.0.0.1', #此處必須是是127.0.0.1 11 port=server.local_bind_port, 12 user='user', 13 passwd='password', 14 db='dbname')

?然后接下來的查詢什么的,直接寫在with那里邊,與conn對齊就可以了。

對于我這邊來說有一個問題是,因為我們對于數據庫連接這一部分,往往是在一個單獨的函數里,與其他數據庫的查詢插入刪除更新操作往往不在一起,這樣的話,with as 有個特點就是,離開這塊作用域,對象就被銷毀掉了,別的函數里是沒法用的,也就會出現一種情況是,連接上了,但是對象又給銷毀掉了,結果查詢的時候直接顯示這個錯誤:OperationalError: (2006, 'MySQL server has gone away'), 而網上查詢這個錯誤,多半說的是因為你查詢的 sql操作的時間過長,或者是傳送的數據太大 ,但是我這個地方實際上就是因為出了with as 的作用域,導致連接又給關閉掉了,所以出現這樣的結果。

關于 with as ,有篇文章寫得很詳盡。理解Python中的with…as…語法

所以我把上邊那個ssh代碼改掉了,像是sshtunnel文檔里邊圖一所對應的代碼,一樣,將SSHTunnelForwarder出來的對象賦值給server,然后啟動server,然后進行一系列操作之后,再stop掉。

本來數據庫連接我們寫成了一個單獨的函數,改了之后,直接也還放在這個函數里就好了,替代原來的connect語句。

1 def connect(self): 2 ''' 3 self.client = MySQLdb.connect(host=self.server, port=self.port, user=self.user, 4 passwd=self.password, db=self.database, 5 charset=self.charset) 6 # log.info('Connect to MySQL Server: ' + self.server) 7 ''' 8 9 server = SSHTunnelForwarder( 10 ('sshhost.domain.com', 22), # B機器的配置 11 ssh_password='ssh_password', 12 ssh_username='ssh_username', 13 remote_bind_address=('mysqlhost.domain.com', mysql.port) 14 ) 15 server.start() 16 17 self.client = MySQLdb.connect(host='127.0.0.1', # 此處必須是是127.0.0.1 18 port=server.local_bind_port, 19 user='username', 20 passwd='password', 21 db='dbname')

然后在進行查詢更新刪除等操作的時候,先連接一下數據庫就好了,用self.client.

連接sqlserver數據庫

跟mysql的一致,但是db那里要注意,SQLServer的是database, 然后是pymssql.connect就可以了,但是這個地方還要說我踩過的一個坑,我寫完sqlserver之后怎么連接都連不上數據庫,后來才發現是版本的問題,我把本地SQLServer更新了之后就可以了。感覺版本是個大坑

轉載于:https://www.cnblogs.com/luyingfeng/p/6386093.html

總結

以上是生活随笔為你收集整理的Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。