Live2D

菜鸟的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()

参考链接:

MySQLdb、Mysqlclient、PyMySQL 三个python的MySQL库的比较和总结

python单例模式----实现数据库连接池

Python数据库的连接实现方法与注意事项

posted @ 2022-04-28 14:01  普利斯-阔米-菜基  阅读(1458)  评论(0编辑  收藏  举报