pymysql通过ssh方式进行数据库操作

由于阿里云服务器安全组规则没有开放3306端口,我们不能直接通过3306端口进行访问,但是可以采用ssh的方式登录mysql数据库,代码如下

# _*_ coding:utf-8 _*_
import pymysql
from sshtunnel import SSHTunnelForwarder

# 数据库配置信息
host = '192.168.1.1'
user = 'username'
dbpassword = 'password'
dbname = 'testdb'


class ExecuteSQL(object):

    # 传入待执行的sql语句sql
    def __init__(self, sql):
        self.sql = sql
	# 查询语句
    def query_sql(self):
        server = SSHTunnelForwarder(
            ssh_address_or_host=(host, 22),  # 指定ssh登录的跳转机的address
            ssh_username='root',  # 跳转机的用户
            ssh_password='123456',  # 跳转机的密码
            remote_bind_address=('127.0.0.1', 3306))
        server.start()
        conn = pymysql.connect(
            user=user,
            passwd=dbpassword,
            host="127.0.0.1", # 此处必须是是127.0.0.1
            db=dbname,
            port=server.local_bind_port,
            cursorclass=pymysql.cursors.DictCursor)
        # 游标
        cursor = conn.cursor()
        try:
            # 执行SQL语句
            cursor.execute(self.sql)
            # 获取所有记录列表
            results = cursor.fetchall()
        except Exception as data:
            print('Error: 执行查询失败,%s' % data)
        # 关闭游标
        cursor.close()
        # 关闭数据库
        conn.close()
        server.close()
        return results
	
	# 新增和修改语句
    def update_sql(self):
        server = SSHTunnelForwarder(
            ssh_address_or_host=(host, 22),  # 指定ssh登录的跳转机的address
            ssh_username='root',  # 跳转机的用户
            ssh_password='123456',  # 跳转机的密码
            remote_bind_address=('127.0.0.1', 3306))
        server.start()
        conn = pymysql.connect(
            user=user,
            passwd=dbpassword,
            host="127.0.0.1", # 此处必须是是127.0.0.1
            db=dbname,
            port=server.local_bind_port,
            cursorclass=pymysql.cursors.DictCursor)
        # 游标
        cursor = conn.cursor()
        try:
            # 执行SQL语句
            cursor.execute(self.sql)
            # 提交
            conn.commit()
        except Exception as data:
            conn.rollback()
            print('Error: 插入或更新失败,%s' % data)
        # 关闭游标
        cursor.close()
        # 关闭数据库
        conn.close()
        server.close()

连接阿里云MySQL数据库需要进行以下步骤: 1. 安装pymysqlsshtunnel模块 ```python pip install pymysql pip install sshtunnel ``` 2. 导入模块 ```python import pymysql from sshtunnel import SSHTunnelForwarder ``` 3. 配置SSH隧道 ```python ssh_host = 'xxx.xxx.xxx.xxx' # 云服务器的IP地址 ssh_port = 22 # 云服务器的SSH端口 ssh_user = 'root' # 云服务器的SSH用户名 ssh_password = 'xxxxxx' # 云服务器的SSH密码 with SSHTunnelForwarder( (ssh_host, ssh_port), # 云服务器的SSH地址和端口 ssh_username=ssh_user, ssh_password=ssh_password, remote_bind_address=('localhost', 3306) # MySQL服务器的地址和端口 ) as tunnel: ``` 4. 配置MySQL连接 ```python db_host = 'localhost' # 本地地址 db_port = tunnel.local_bind_port # 映射的端口 db_user = 'root' # MySQL用户名 db_password = 'xxxxxx' # MySQL密码 db_name = 'test' # 数据库名称 conn = pymysql.connect( host=db_host, port=db_port, user=db_user, password=db_password, database=db_name, charset='utf8mb4' ) cursor = conn.cursor() # 使用 cursor 进行数据库操作 # ... cursor.close() conn.close() ``` 5. 完整代码示例 ```python import pymysql from sshtunnel import SSHTunnelForwarder ssh_host = 'xxx.xxx.xxx.xxx' # 云服务器的IP地址 ssh_port = 22 # 云服务器的SSH端口 ssh_user = 'root' # 云服务器的SSH用户名 ssh_password = 'xxxxxx' # 云服务器的SSH密码 with SSHTunnelForwarder( (ssh_host, ssh_port), # 云服务器的SSH地址和端口 ssh_username=ssh_user, ssh_password=ssh_password, remote_bind_address=('localhost', 3306) # MySQL服务器的地址和端口 ) as tunnel: db_host = 'localhost' # 本地地址 db_port = tunnel.local_bind_port # 映射的端口 db_user = 'root' # MySQL用户名 db_password = 'xxxxxx' # MySQL密码 db_name = 'test' # 数据库名称 conn = pymysql.connect( host=db_host, port=db_port, user=db_user, password=db_password, database=db_name, charset='utf8mb4' ) cursor = conn.cursor() # 使用 cursor 进行数据库操作 # ... cursor.close() conn.close() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值