在进行Python开发以及测试框架、工具开发时,我们会经常从数据库获取相关数据、更新数据库中数据,Python提供了很多的包供大家使用,在这里我简单给大家介绍一下pymysql。
1、连接数据库
pymysql.connect提供了连接数据库的方法,该方法会连接数据库并返回一个对象,表示当前到数据库的会话。
下面介绍相关参数:
host | 主机名称,若本地数据库则为127.0.0.1 |
port | 连接数据库的端口,一般为3306 |
user | 连接数据库的用户名 |
password | 连接数据库的密码 |
db | 数据库名称 |
use_unicode | 将数据库中的数据按GBK格式解码成字节码 |
charset | 将解码后的字节码按UTF-8格式编码数据,最后再将数据返回给客户端 |
import pymysql
conn=pymysql.connect(host='127.0.0.1',port='3306',user='root',passwd='198903017',
db='api_database',use_unicode=True, charset="utf8",)
下面介绍连接对象的方法:
close() | 关闭连接对象,之后连接对象及其游标cursor将不可用 |
commit() | 提交未提交的事务,如果支持的话,否则什么都不做 |
rollback() | 回滚未提交的事务(可能不可用) |
cursor() | 返回连接的游标对象 |
2、游标
下面介绍游标对象的方法:
callproc(name[,params]) | 使用指定的参数调用指定的数据库过程(可选) |
close() | 关闭游标。关闭后游标不可用 |
execute(open[,params]) | 执行一个sql操作---可能指定参数 |
executemany(open,pseq) | 执行指定的sql操作多次,每次都序列中的一组参数 |
fetchone() | 以序列的方式取回查询结果中的下一行;如果没有更好的行,就返回None |
fetchmany([size]) | 取回查询结果中的多行,其中参数size的值默认为arraysize |
fetchall() | 以序列的方式取回余下的所有行 |
nextset() | 跳到下一个结果集,这个方法是可选的 |
setinputsizes(sizes) | 用于为参数预定义内存区域 |
setoutputsize(size[,coll]) | 为取回大量数据而设定缓冲区长度 |
下面介绍游标对象的属性
description | 由结果列描述组成的序列(只读) |
rowcount | 结果包含的行数(只读) |
arraysize | fetchmany返回的行数,默认为1 |
3、pymysql自定义封装函数(提供借鉴)
下面是我自己在做接口自动化框架时封装的关于数据库操作的类以及类里面的一些函数,提供给大家借鉴:
import pymysql
from Common.CommonTools.PathTools import config_path
from Common.CommonTools.ConfigReadTools import ConfigReadTools
'''数据库操作相关函数'''
class DataBaseTools:
def __init__(self):
'''初始化-连接数据库'''
self.conn=self._connent_db() #连接数据库
self.cur=self.conn.cursor() #创建游标
def _connent_db(self):
'''连接数据库'''
configread = ConfigReadTools(config_path)
database_conf = configread.get_section_item('DATABASE_CONF')
try:
conn=pymysql.connect(host=database_conf['Host'], #数据库地址
port=int(database_conf['Port']), #端口号
user=database_conf['User'], #登录用户名
passwd=database_conf['Password'], #登录密码
db=database_conf['DB'], #连接的数据库
use_unicode=True, charset="utf8",)
return conn
except Exception as e:
print('[Error] 数据库连接失败,具体错误:%s'%e)
def execute_sql(self,sql):
'''
执行sql语句
:param sql:sql语句
'''
try:
self.cur.execute(sql) #执行sql
except Exception as e:
self.conn.rollback() #回退数据库
print('[Error] sql语句有误,数据库回退,具体错误:%s'%e)
else:
self.conn.commit() #sql正确时才进行提交
def get_select_alldata(self,selectsql):
'''
获取查询sql对应的所有数据
:param sql: select sql语句
:return: 查询数据信息
'''
try:
if 'Select' in selectsql or 'select' in selectsql or 'SELECT' in selectsql:
self.cur.execute(selectsql)
except Exception as e:
self.conn.rollback()
print('[Error] 查询sql语句有误.数据库回退,具体错误:%s'%e)
else:
try:
result = self.cur.fetchall() # 获取查询结果
return result
except Exception as a:
print('[Error] 执行sql报错,具体错误:%s'%a)
def get_selectdata_row(self,selectsql,index):
'''
获取查询sql反馈的某一行数据
:param selectsql: 查询sql语句
:param index: 指定一行数据
:return: 反馈指定一行的数据
'''
result=self.get_select_alldata(selectsql)
return result[index]
def get_selectdata_column(self,selectsql,index):
'''
获取查询sql反馈的某一列数据
:param selectsql:查询sql语句
:param index:指定一列数据
:return:反馈指定一列的数据
'''
column_data=[]
result=self.get_select_alldata(selectsql)
for i in range(len(result)):
column_data.append(result[i][index])
return column_data
def get_specific_data(self,selectsql,rowindex,columnindex):
'''
获取指定的某一行的某一列的值,获取特定某个数据
:param selectsql: 查询sql语句
:param rowindex: 指定行数
:param columnindex: 指定列数
:return: 特定某个数据
'''
result=self.get_select_alldata(selectsql)
return result[rowindex][columnindex]
def check_value_isnull(self,selectsql,rowindex,columnindex):
'''
检查指定单元格的value是否为空,空返回True,非空返回False
:param selectsql: 查询sql语句
:param rowindex: 指定行数
:param columnindex: 指定列数
:return: True/False
'''
value=self.get_specific_data(selectsql,rowindex,columnindex)
if value==None:
return True
else:
return False
def cur_close(self):
'''关闭游标'''
self.cur.close()
def close_db(self):
'''关闭数据库'''
try:
self.conn.close()
except Exception as e:
print('[Error] 数据库关闭出错.具体错误:%s'%e)