Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库
转载自 https://www.cnblogs.com/luyingfeng/p/6386093.html
安全起见,数据库的访问多半是要做限制的,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常使用造成了很大不便。所以前几天做了个需求,是希望在任何机器上都可以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更新了之后就可以了。感觉版本是个大坑
Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库的更多相关文章
- Phalcon多模块如何实现连接不同数据库 《Phalcon入坑指南系列 五》
本系列目录 一.Phalcon在Windows上安装 <Phalcon入坑指南系列 一> 二.Phalcon入坑必须知道的功能<Phalcon入坑指南系列 二> 三.Phalc ...
- “VS2013无法连接远程数据库”解决方案
“VS2013无法连接远程数据库” 解决方案:以管理员身份登录CMD,输入netsh winsock reset并回车(注意,必须是已管理员身份运行,这个重置LSP连接) 或 netsh winsoc ...
- 通过IIS不能连接远程数据库的问题
近期遇到一个奇怪的问题:在调试MES程序时发现,如果连接的是远程的SQL SERVER数据库(通过了IIS),则提示连接失败,就是经常见到的数据库不允许远程连接的错误提示: 而且又测试了以下几种情况: ...
- PLSQL DEVELOPER 连接远程数据库 OCI客户端安装方法
安装使用过PLSQL Dev都知道,要连接数据库,必须配置TNS(Transparence Network Substrate),而直接安装PLSQL Dev 之后,本机是没有Oracle HOME的 ...
- pl/sql developer连接远程数据库
本地不安装oracle client程序,直接使用pl/sql developer连接远程数据库 考虑到机子本身资源有限,一个client会占用很多资源,尝试使用不安装客户端的方式进行远程连接. 需要 ...
- 解决SQL Server管理器无法连接远程数据库Error: 1326错误
解决SQL Server管理器无法连接远程数据库Error: 1326错误 我们在在使用SQL Server时都会遇到使用SQL Server Management Studio无法连接远程数据库实例 ...
- 连接远程数据库ORACLE11g,错误百出!
客户机中PLSQL DEV访问虚拟机中的ORACLE11g,错误百出! 创建时间: 2017/10/14 18:44 作者: CNSIMO 标签: ORACLE 忙了一下午,只有两个字形容:麻烦! ...
- 解决SQL Server管理器无法连接远程数据库的问题(转)
add by zhj: 本文最后那个数据库别名没搞明白,在我的测试中没有建别名,是可以的.远程登陆时,服务器名称: 服务器IP,端口号 (如223.42.155.248,52134 如果是默认端口号1 ...
- plsql oracle client没有正确安装(plsql连接远程数据库)
plsql oracle client没有正确安装(plsql连接远程数据库) CreateTime--2018年4月23日16:55:11 Author:Marydon 1.情景再现 2.问题解 ...
随机推荐
- Redis JAVA客户端 Jedis常用方法
Jedis 是 Redis 官方首选的 Java 客户端开发包 (redis的java版本的客户端实现) #MAVEN配置 <dependency> <groupId>redi ...
- postgresql data数据目录路径迁移
默认的数据库路径是/var/lib/pgsql/9.x/data 将现有的数据库文件全部拷贝到新的数据库路径下,然后重启 新建一个路径作为新的数据库数据路径,假如是/home/data sudo mk ...
- linux查看端口命令和kill
1.查看 netstat -atunlp 2kill:kill -9 PID
- 2015 Multi-University Training Contest 3 1001 Magician
Magician Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5316 Mean: n个数,2种操作,1是单点更新,2是询问区间 ...
- EasyUI Window和Layout
我们建立tabs内容. <div class="easyui-window" title="Layout Window" icon="icon- ...
- windows 10 搭建go环境
1. 到 https://golang.org/ 下载go 的msi安装包.安装后 GOROOT 已经自动帮你设置好. 2.设置GOPATH 不能跟 GOROOT 同一个目录.到系统环境变量里新增一个 ...
- RabbitMQ之Queues-5
工作队列的主要任务是:避免立刻执行资源密集型任务,然后必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送给队列.工作进行在后台运行并不断的从队列中取出任务然后执行.当你运行了多个工作进 ...
- TPS和事务响应时间的关系
例子:一个高速路有10个入口,每个入口每秒钟只能进1辆车 1.请问1秒钟最多能进几辆车? TPS=10 2.每辆车需要多长时间进行响应? reponse time = 1 3.改成20辆车 ...
- 线程本地变更,即ThreadLocal-->Spring事务管理
我们知道Spring通过各种模板类降低了开发者使用各种数据持久技术的难度.这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突.我们使用模板类访问底层数据,根据持久化技术 ...
- CSS代码重构与优化
CSS代码重构的基本方法 前面说到了CSS代码重构的目的,现在我们来说说一些如何达到这些目的的一些基本方法,这些方法都是易于理解,容易实施的一些手段,大家平时可能也不知不觉地在使用它. 提高CSS性能 ...