pymysql操作云服务器数据库

1.pymysql 简介及测试工作中的应用

pymysql是一个连接mysql数据库的第三方模块,可作为连接mysql数据库的客户端,对数据库进行新增,删除,修改,查询等操作。pymysql在测试工作中一般用于取数据库的数据作为自动化测试用例的参数以及自动化测试用例完成后,获取对于业务库表的数据进行断言

2.下载安装pymysql

#使用pip安装pymysql第三方模块pip install pymysql

3.下载安装sshtunnel

由于要操作云服务上的mysql数据库,通常直接连接,由于安全机制,会连接失败,这里需要使用ssh隧道进行连接,需要先安装sshtunnel

pip install sshtunnel

4.使用前的准备工作

使用前需要提前准备下面的配置:

#提供服务的云服务器地址host = 119.91.144.93#ssh远程连接云服务器的账户信息ssh_username = rootssh_password=XXXXXXXXXXXXXXXXXXXXX#要连接的数据库配置信息mysql_port = 3306 #云服务器mysql服务的端口号user = root #云服务器mysql数据库的登录用户password = xxxxxxxxxxxxxxxxxx #云服务器mysql数据库的登录密码dbname = test #要访问的数据名称

5.具体使用

5.1创建ssh服务,并启动服务

server = SSHTunnelForwarder(            ssh_address_or_host=(host, 22),  # 指定ssh登录云服务器的IP地址及ssh协议默认端口号            ssh_username=ssh_username,  # 登录云服务器的用户名            ssh_password=ssh_password,  # 登录云服务器的密码            remote_bind_address=(host,mysql_port), #远程的mysql服务器IP地址及端口号            local_bind_address=(0.0.0.0, 10022)  # 开启本地转发端口为10022        ) #远程mysql服务器绑定的IP和端口号(端口号可以是本地电脑任何未被使用的端口号)server.start() #启动ssh服务

5.2使用pymysql创建连接,并创建游标

#创建连接conn = pymysql.connect(            user=user,            passwd=password,            host=127.0.0.1,  # 由于是本地转发,此处必须是是127.0.0.1            db=dbname,            port=10022, #端口号为本地转发的端口号            cursorclass=pymysql.cursors.DictCursor) #设置查询结果以字典格式显示# 创建游标cursor = conn.cursor()

5.3利用游标执行sql语句

sql = "select * from ecs_users where user_id=1;"cursor.execute(sql) #利用游标执行sql语句results = cursor.fetchall() #如果是查询语句,可以通过游标对象的fetchall()方法获取所有的查询结果#result = cursor.fetchone() #获取查询结果的一行数据,记住如果先执行了所有,然后获取一行,获取不到,因为获取所有时,光标已经到在最后,没数据了print(results)#如果是增、删、改的sql语句执行完毕后,需要提交#conn.commit()

5.3利用游标执行sql语句

执行完毕后需要关闭游标、连接、ssh服务

# 关闭游标cursor.close()# 关闭数据库conn.close()# 关闭ssh服务连接server.close()

6.实际工作中如何封装

上面讲解了pymysql具体如何使用,但是这些代码未被封装,导致不能随意调用,下面我们将结合工作中的具体应用,将这代码封装起来,方便后续在工作调用

#!/usr/bin/env python# -*- coding: utf-8 -*-author: Wangke(CR7)project: PYMYSQLfile: demo1.pydate: 2022/5/30import pymysqlfrom sshtunnel import SSHTunnelForwarder#提供服务的云服务器地址host = 119.91.144.93#ssh远程连接云服务器的账户信息ssh_username = rootssh_password=XXXXXXXXXXXXXXXX#要连接的数据库配置信息mysql_port = 3306 #云服务器mysql服务的端口号user = root #云服务器mysql数据库的登录用户password = XXXXXXXXXXXXXXX #云服务器mysql数据库的登录密码dbname = test #要访问的数据名称class ExecuteSQL(object):#创建一个数据库执行器的类    # 初始化执行器    def __init__(self):        self.server = SSHTunnelForwarder(            ssh_address_or_host=(host, 22),  # 指定ssh登录云服务器的IP地址及ssh协议默认端口号            ssh_username=ssh_username,  # 登录云服务器的用户名            ssh_password=ssh_password,  # 登录云服务器的密码            remote_bind_address=(host,mysql_port), #远程的mysql服务器IP地址机端口号            local_bind_address=(0.0.0.0, 10022)  # 开启本地转发端口为10022        ) #远程mysql服务器绑定的IP和端口号        self.server.start() #启动ssh服务        self.conn = pymysql.connect(            user=user,            passwd=password,            host=127.0.0.1,  # 由于是本地转发,此处必须是是127.0.0.1            db=dbname,            port=10022, #端口号为本地转发的端口号            cursorclass=pymysql.cursors.DictCursor) #设置查询结果以字典格式显示        # 游标        self.cursor = self.conn.cursor()    # 封装查询语句的方法    def select_sql(self,sql):        try:            # 执行SQL语句            self.cursor.execute(sql)            # 获取所有记录列表            results = self.cursor.fetchall()        except Exception as msg:            results = Error: 执行查询失败,%s % msg        # 关闭游标        self.cursor.close()        # 关闭数据库        self.conn.close()        # 关闭ssh服务连接        self.server.close()        return results    # 封装增删改的方法    def other_sql(self,sql):        try:            # 执行SQL语句            self.cursor.execute(sql)            # 提交            self.conn.commit()            result = OK: 插入或更新成功        except Exception as msg:            self.conn.rollback()            result = Error: 插入或更新失败,%s % msg        # 关闭游标        self.cursor.close()        # 关闭数据库        self.conn.close()        # 关闭ssh服务连接        self.server.close()        return resultif __name__ == __main__:    sql = "select * from ecs_users where user_id=1;"    exector = ExecuteSQL() #生成执行sql语句执行器的实例    res = exector.select_sql(sql) #执行sql    print(res)