菜鸟的Python学习笔记——SSH隧道连接远程数据库(MySQL)
一.python数据库驱动:
- mysqldb(python 2中使用)
- pymysql(纯 Python 实现的驱动,速度上比不上 MySQLdb,但安装简单,同时也兼容 MySQLdb)
- mysqlclient(兼容mysqldb,可以看做python 3.X的mysqldb,同时在导包的时候也是用import mysqldb)
二.常用函数:
数据库连接对事务操作的方法:commit() 提交 rollback() 回滚
cursor用来执行命令的方法:
callproc(self,procname,args)
用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args)
执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args)
执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self)
移动到下一个结果集
cursor用来接收返回值的方法:
fetchall(self)
接收全部的返回结果行
fetchmany(self, size=None)
接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据
fetchone(self)
返回一条结果行
scroll(self, value, mode='relative')
移动指针到某一行,如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条。
三.本地连接数据库:
-
本机配置:MySQL5.7,python3.8,mysqlclient
-
尝试连接(查询):
import MySQLdb db=MySQLdb.connect( '''打开数据库连接''' host='127.0.0.1', port=3306,#mysql默认3306,根据自己实际端口 user='',#数据库用户名 passwd='',#数据库密码 db='',#所连数据库库名 charset='utf8',#编码方式,要跟数据库的编码一致 ) '''获取操作游标''' cursor=db.cursor(cursorclass=MySQLdb.cursors.DictCursor)#将连接查询到的结果以字典的形式获取 '''通过execute执行sql语句''' sql='SELECT * FROM test_common.COMMON_COMPANY WHERE phone="12344445555" LIMIT 10' cursor.execute(sql) data=cursor.fetchone()#获取一条数据 #data=cursor.fetchall()#获取(查询到的)所有数据 #data=cursor.fetchmany(10)#获取指定数量10条数据 cursor().close()#关闭游标 db.close()#关闭数据库连接
四.SSH隧道连接远程数据库(本地通过ssh连接跳板机,再通过跳板机连接数据库)
用python连接数据库之前,先来看一下Navicat上SSH隧道连接远程数据库:
-
常规:
填写数据库的信息
-
SSH
填写SSH的信息,IP是跳板机的IP
现在回到代码:
这里引入了sshtunnel来创建SSH连接
from sshtunnel import SSHTunnelForwarder
import MySQLdb
def get_ssh_tunnel():
'''创建SSH连接,传入连接参数'''
server=SSHTunnelForwarder(
ssh_address_or_host=('跳板机的IP',22),#样例连接的端口为22,自己做调整
ssh_username='',#SSH用户名
ssh_password='',#SSH密码
ssh_pkey='E:/mysql5.7/XXX.pem',#这里可以自己填入SSH连接的密钥,或者密钥文件的地址,pem文件的实际内容也是RSA密钥
remote_bind_address=('远程数据库的IP',3306),
)
# server.skip_tunnel_checkup = False
server.start()
# server.check_tunnels()
# print(server.tunnel_is_up, flush=True)
return server
def get_db_conn(sshserver):
# dbip=sshserver.local_bind_host
dbport=sshserver.local_bind_port
db=MySQLdb.connect(
host='127.0.0.1',#默认本地IP
port=dbport,
user='',
passwd='',
db='',
charset='utf8',
)
return db
if __name__ == '__main__':
sshserver=get_ssh_tunnel()
db=get_db_conn(sshserver)
cursor=db.cursor(cursorclass=MySQLdb.cursors.DictCursor)
sql='SELECT * FROM test_common.COMMON_COMPANY WHERE phone="12344445555" LIMIT 10'
cursor.execute(sql)
data=cursor.fetchone()
print(data)
cursor.close
db.close()
参考链接: