背景
如果需要访问远程服务器的Mysql数据库,但是该Mysql数据库为了安全期间,安全措施设置为只允许本地连接(也就是你需要登录到该台服务器才能使用),其他远程连接是不可以直接访问,并且相应的端口也做了修改,那么就需要基于ssh来连接该数据库。这种方式连接数据库与Navicat里面界面化基于ssh连接一样。
安装支持库
如果要连接Mysql,首先需要安装pymysql
1pip install pymysql
安装基于ssh的库sshtunnel
1pip install sshtunnel #当前最新 0.3.1版
建议安装最新的sshtunnel库,旧版本库有一些bug
连接Mysql
基于ssh连接Mysql可以查看sshtunnel的文档,里面有一些案例
1with SSHTunnelForwarder(
2 ('192.168.1.1', 2222),
3 ssh_password='123456',
4 ssh_username='root',
5 remote_bind_address=('127.0.0.1', 3306)) as server:
6 print('SSH连接成功')
7 conn = pymysql.connect(host='127.0.0.1',
8 port=server.local_bind_port,
9 user='root',
10 database='data',
11 charset='utf8')
12 print('mysql数据库连接成功')
13 cursor = conn.cursor()
14 ... #获取数据操作,此处省略
15 cursor.close()
16 conn.close()
自定义查询函数
可以对上面的连接进行封装为一个函数,方便其他地方使用
1def mysql_ssh(sql,args=None):
2 with SSHTunnelForwarder(
3 ('192.168.1.1', 2222),
4 ssh_password='123456',
5 ssh_username='root',
6 remote_bind_address=('127.0.0.1', 3306)) as server:
7 print('SSH连接成功')
8 conn = pymysql.connect(host='127.0.0.1',
9 port=server.local_bind_port,
10 user='root',
11 database='data',
12 charset='utf8')
13 print('mysql数据库连接成功')
14 cursor = conn.cursor()
15 print('游标获取成功')
16 try:
17 print(f'执行查询语句:{sql} 参数:{args}')
18 cursor.execute(sql,args)
19 print('数据查询成功')
20 conn.commit()
21 print('事务提交成功')
22 datas = cursor.fetchall()
23 success = True
24 except:
25 print('数据查询失败')
26 datas = None
27 success = False
28
29 print('正在关闭数据库连接')
30 cursor.close()
31 conn.close()
32
33 return datas, success
注意点:
在使用数据库时,
conn.commit()
、cursor.close()
、conn.close()
这些一定要规范使用,防止不必要的bug传入参数时建议用这种方式
cursor.execute(sql,args)
,防止sql注入的风险
历史相关文章
Python加载txt数据乱码问题升级版解决方法
Python文件打包成exe可执行程序
以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注 DataShare ,不定期分享干货