我们在编写自动化测试用例的时候,不管是前置条件、后置条件、还是参数化、关联等,都会用到数据库,那Python对数据库的操作是如何实现的呢?
下面我们将用两种实现方式完成对数据库的增、删、改简单操作:
前置(安装依赖包)
pip install PyMySQL
方式一:
思路分析:
-
初始化数据库连接配置信息
-
建立数据库连接,创建数据库对象
-
开启游标
-
执行增、删、改sql语句
-
事物提交
-
执行失败,事务回滚
-
关闭游标
-
关闭数据库连接
上代码:
# -*- coding: utf-8 -*-
@公众号 : 芦荟全栈测开
# @File : mysqlDB.py
# @Software: PyCharm
import pymysql
import logging
class MysqlDB():
"数据库操作"
def __new__(cls, host, port, user, passwd, database=None):
if not hasattr(cls, "_instance"):
cls._instance = super(MysqlDB, cls).__new__(cls)
return cls._instance
def __init__(self, host, port, user, passwd, database=None):
try:
self.conn = pymysql.connect(
host=host, #数据库host地址
port=int(port), #数据库端口号
user=user, #数据库用户名
password=passwd, #数据库密码
database=database, #数据库名
charset="utf8"
)
except Exception as e:
logging.error("数据库连接异常,异常报错信息:{}".format(e))
def selectDb(self, sql):
"""
数据库查询
:param sql: 查询的sql语句
:return: 查询结果,元祖
"""
self.cursor = self.conn.cursor()
try:
self.cursor.execute(sql)
data = self.cursor.fetchall() # 返回所有记录
except Exception as e:
logging.error("数据库查询出现异常,异常报错信息:{}".format(e))
else:
return data
finally:
self.cursor.close()
self.closeDb()
def selectDb_dict(self, sql) -> dict:
"""
数据库查询
:param sql: 查询的sql语句
:return: 查询结果,字典
"""
self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)
try:
self.cursor.execute(sql)
data = self.cursor.fetchall() # 返回所有记录
except Exception as e:
logging.error("数据库查询出现异常,异常报错信息:{}".format(e))
else:
return data
finally:
self.cursor.close()
self.closeDb()
def execute_sql(self, sql):
"执行sql"
self.cursor = self.conn.cursor()
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
self.conn.rollback()
logging.error("sql语句执行失败{}".format(e))
finally:
self.cursor.close()
self.closeDb()
def insertDb(self, sql):
"""
数据库插入数据
:param sql: 插入数据库的sql语句
:return:
"""
self.cursor = self.conn.cursor()
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
logging.error("数据库插入数据出现异常,异常报错信息:{}".format(e))
self.conn.rollback()
finally:
self.cursor.close()
self.closeDb()
def updataDb(self, sql):
"""
更新数据库数据
:param sql: 更新数据库sql语句
:return:
"""
self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
self.conn.rollback()
logging.error("数据库更新数据出现异常,异常报错信息:{}".format(e))
finally:
self.cursor.close()
self.closeDb()
def closeDb(self):
"""数据库连接关闭"""
try:
self.conn.close()
except Exception as e:
logging.error("关闭mysql失败:{}".format(e))
API解读:
pymysql.connect() 的参数即为 Connection() 构造函数的参数。
self.conn.cursor() 开启游标
self.cursor.execute(sql) 执行sql语句
self.conn.commit() 事物commit提交
self.conn.rollback() 事物回滚
self.conn.close() 关闭数据库连接
调用:
conInfo = {
"host": "localhost",
"port": 3306,
"user": "root",
"passwd": "root",
"database": "mysql"
}
sql = "SELECT * FROM USER;"
result = MysqlDB(**conInfo).selectDb(sql)
方式二:
# -*- coding: utf-8 -*-
@公众号 : 芦荟全栈测开
# @File : mysqlDB.py
# @Software: PyCharm
import pymysql
import logging
class MysqlDB():
"数据库操作"
def __init__(self, host, port, user, passwd, database=None):
try:
self.conn = pymysql.connect(
host=host,
port=int(port),
user=user,
password=passwd,
database=database,
charset="utf8"
)
self.cursor = self.conn.cursor()
except Exception as e:
logging.error("数据库连接异常,异常报错信息:{}".format(e))
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.cursor.close()
self.conn.close()
def selectAll(self, sql):
"""
查询所有
:param sql: sql语句
:return: 返回查询结果(元祖)
"""
try:
self.cursor.execute(sql)
result = self.cursor.fetchall()
except Exception as e:
logging.error(f"数据库查询失败->{e}-{sql}")
else:
return result
def selectOne(self, sql):
"""
查询单挑数据
:param sql:
:return: 返回查询结果(元祖)
"""
try:
self.cursor.execute(sql)
result = self.cursor.fetchone()
except Exception as e:
logging.error(f"数据库单挑查询失败->{e}->{sql}")
else:
return result
def insertSql(self, sql):
"""
数据库插入
:param sql:
:return:
"""
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
self.conn.rollback()
logging.error(f"数据库插入失败->{e}->{sql}")
def updateSql(self,sql):
"""
数据库更新
:param sql:
:return:
"""
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
self.conn.rollback()
logging.error(f"数据库更新操作失败->{e}->{sql}")
调用:
conInfo = {
"host": "localhost",
"port": 3306,
"user": "root",
"passwd": "root",
"database": "mysql"
}
sql = "SELECT * FROM USER;"
with MysqlDB(**conInfo) as db:
result = db.selectAll(sql)
细心的同学可能有疑问,在更新/插入方法体实现的怎么一样啊?当然可以这么写
def insertSql(self, tableName, key, datas):
"""
数据库插入
:param tableName: 表名
:param key: 插入的字段名
:param values: 插入的字段值
:return:
"""
try:
self.cursor.execute(f"INSERT INTO {tableName} ({key,}) values ({datas,})")
self.conn.commit()
except Exception as e:
self.conn.rollback()
logging.error(f"数据库插入失败->{e}->{sql}")