1. 介绍
在搭建测试框架过程中,会遇到需要频繁操作数据库的情况,会用到pymysql进行数据库的操作
PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,支持兼容 Python 3
2.安装
pip install pymysql
3.使用步骤
3.1 与数据库建立连接
conn = pymysql.connect(
host='127.0.0.1', # 与本地数据库建立连接,可以尝试其他电脑的ip地址
port=3306, # 端口可写可不写,默认3306
user='root',
password="111",
database="navicat_test1", # 选择一个库,关键字可以简化为db
charset="utf8mb4"
) # 更多参数可以点进connect的源码去看
3.2 产生游标
cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
# 括号内不填写额外参数数据是元组指定性不强[(), ()] # 让数据自动组织成字典,括号内填写pymysql.cursors.DictCursor指定返回的是[{},{}]
3.3 编写sql
select code from users_verifycode where mobile= '15191857925' order by add_time desc limit 1;
3.4 代码执行sql
rows= cursor.execute(sql) # 返回sql影响的数据行数
print(rows) #影响的行数
3.5 获取执行的结果
cursor.fetchone() # 从当前位置 拿到一条执行结果
cursor.fetchall() # 拿到所有结果
crusor.fetchmany(n) # 从当前位置 拿到多个结果
如果是增删改操作的话,需要commit()
update_sql="delete from users_verifycode where mobile='15191857925'"
cursor.execute(update_sql) # 改动某个数据值
conn.commit() # 针对 增 删 改 需要二次确认(代码确认
此外在创建连接的时候,可以设置自动commit
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password="111",
database="a_pro_user",
charset="utf8mb4",
autocommit=True, # <---自动确认增删改
)
4.数据库类的封装
import pymysql
from common.log_util import logger
from common.parseData import base_data
data = base_data.get_ini_data()["mysql"]
DB_INFO = {
"host":data["MYSQL_HOST"],
#ini文件读取的都是字符串,但是连接的时候需要的是数字,做转换
"port":int(data["MYSQL_PORT"]),
"user":data["MYSQL_USER"],
"password":data["MYSQL_PASSWD"],
"db":data["MYSQL_DB"]
}
class DbUtil:
"""
数据库链接工具类
"""
def __init__(self):
#获取链接,**DB_INFO将字典解包传入
self.conn = pymysql.connect(**DB_INFO,autocommit=True)
#获取游标
# 括号内不填写额外参数数据是元组指定性不强[(), ()]
# 让数据自动组织成字典,括号内填写pymysql.cursors.DictCursor指定返回的是[{},{}]
self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
def __del__(self):
"""
关闭游标和连接
:return:
"""
self.cursor.close()
self.conn.close()
def fetch_all(self, sql):
"""
查询所有的sql
:param sql:
:return:
"""
logger.info("执行sql:{}".format(sql))
self.cursor.execute(sql)
return self.cursor.fetchall()
def fetch_one(self,sql):
"""
查询单条结果
:param sql:
:return:
"""
logger.info("执行sql:{}".format(sql))
self.cursor.execute(sql)
return self.cursor.fetchone()
def execute_db(self,sql):
try:
logger.info("执行sql:{}".format(sql))
self.cursor.execute(sql)
except Exception as e:
logger.info("执行SQL出错{}".format(e))
db = DbUtil()
if __name__ == '__main__':
sql = "select code from users_verifycode where mobile= '15191857925' order by add_time desc limit 1;"
res = db.fetch_one(sql)
import pprint
pprint.pprint(res)