python 使用mysqldb模块通过SSHTunnelForwarder隧道连接mysql
python 使用mysqldb模块通过SSHTunnelForwarder隧道连接mysql
(1)出于安全考虑,数据库服务器只允许堡垒机通过ssh访问,这对日常的使用带来了麻烦。昨天的工作中,就遇到了这样的问题,MySQL数据库放在了服务器A上,只允许服务器B来访问,而我在机器C上,可以通过ssh连接服务器B。为了解决在机器C上连接mysql这个问题
如下图所示:
(2)talk is cheap,让我们直接看代码吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | # coding:utf-8 ''' # 希望对大家有帮助哈,请多提问题 create by yyz date: 2017/09/05 ''' import sys import MySQLdb import os from sshtunnel import SSHTunnelForwarder def write_to_txt_file(filename, results_list): # 如果该文件已存在,则删除该文件 if os.path.exists(filename) = = True : os.remove(filename) with open (filename, "ab" ) as f: for item in results_list: b = "\t" .join([ str (a) for a in item]) # print b f.write(b + "\n" ) ''' 出于安全考虑,数据库服务器只允许堡垒机通过ssh访问,这对日常的使用带来了麻烦。 昨天的工作中,就遇到了这样的问题,MySQL数据库放在了服务器A上,只允许服务器B来访问, 而我在机器C上,可以通过ssh连接服务器B。 ''' # 定义MySQL操作命令 sql1 = "select * from sepcify_database.one_and_two_stars limit 10" # 指定了操作表所在的数据库名字 sql2 = "select * from one_and_two_stars limit 10" # 没有指定操作表所在的数据库名字 # 连接数据库 def ssh_connect_and_read_db(out_savename): with SSHTunnelForwarder( ( 'xxx.xx.xx.xx' , 4344 ), # B机器的配置--跳板机 ssh_username = "workuser" , # B机器的配置--跳板机账号 ssh_password = "A=password" , # B机器的配置--跳板机账户密码 remote_bind_address = ( 'xxx.xx.xx.xxx' , 3306 )) as server: # A机器的配置-MySQL服务器 conn = MySQLdb.connect(host = '127.0.0.1' , # 此处必须是必须是127.0.0.1,代表C机器 port = server.local_bind_port, user = 'zausers' , # A机器的配置-MySQL服务器账户 passwd = '10FN_password' # A机器的配置-MySQL服务器密码c ,charset = 'utf8' # 和数据库字符编码集合,保持一致,这样能够解决读出数据的中文乱码问题 #,db='sepcify_database' # 可以限定,只访问特定的数据库,否则需要在mysql的查询或者操作语句中,指定好表名 ) # print conn # 打开数据库 cursor = conn.cursor() # 执行sql操作 try : # test1 cursor.execute( "SELECT VERSION()" ) data = cursor.fetchone() print "Database version : %s " % data # test2 test_sql = "select * from sepcify_database.one_and_two_stars limit 3" cursor.execute(test_sql) data = cursor.fetchall() data_list = list (data) # 写入txt文档 write_to_txt_file(out_savename,data_list) #return data_list except : info = sys.exc_info() print info[ 0 ] print info[ 1 ] # 关闭数据库 conn.close() ssh_connect_and_read_db( "out_savename.txt" ) |
(3)注意哈:
(0)在查询数据库中中文会显示乱码的。经过我从网上查找,发现用一个属性有可搞定:
在Python代码 conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python') 中加一个属性:
改为:conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python',charset='utf8')
charset是要跟你数据库的编码一样,如果是数据库是gb2312 ,则写charset='gb2312'。
(1)在使用过程中,可能会遇到如下经典错误
:MySQL远程连接丢失问题解决方法(OperationalError: (2013, 'Lost connection to MySQL server during query'))
原因是没连接mysql服务器,问题可能是几个服务器的参数配置错误,如端口,服务器IP,密码等;或者是mysql服务器响应超时,请优化sql语句,确保能够在终端正确执行。
参见: https://stackoverflow.com/questions/38042300/gae-python-operationalerror-2013-lost-connection-to-mysql-server-during-qu
(2)sshtunnel 安装,请参照安装:
http://sshtunnel.readthedocs.io/en/latest/?badge=latest
(3)Mac或linux直接安装
pip install sshtunnel
(4)sshtunnel官方使用例子,请参照例子:
http://sshtunnel.readthedocs.io/en/latest/?badge=latest#example-1
————————————————
版权声明:本文为CSDN博主「Data_IT_Farmer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/helloxiaozhe/article/details/77850367
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律