# python操作mysql
# 安装pymysql
# pip install pymysql
# 第一步,连接数据库
# 第二步,创建一个游标对象,即类似操作数据库的鼠标
# 第三步,执行sql语句
# 第四步,获取查询结果
# 第五步,关闭游标
# 第六步,断开数据库连接
import pymysql
# 第一步,连接数据库
mysql = pymysql.connect(host='8.129.91.152',
port=3306, # 端口为数值类型
user='future',
password='123456',
charset='utf8', # 注意使用'utf8',不能使用'utf-8'
cursorclass= pymysql.cursors.DictCursor # 游标类型参数,如果不传这个参数默认cur.fetchall()得到的是元组,传的话是列表嵌套字典
# database=None 可在此处指定要操作的库,但是一般在执行sql语句中选择库,因为可能会涉及到多库操作
)
# 第二步,创建一个游标对象,即类似操作数据库的鼠标
cur = mysql.cursor()
# 第三步,执行sql语句
sql = 'SELECT * FROM futureloan.member LIMIT 3' # 可能会多库操作,一般在此处选择库;否则报错pymysql.err.OperationalError: (1046, 'No database selected')
res = cur.execute(sql)
print(res) # 3 此处打印的是查询出多少条数据
# 第四步,获取查询结果
# cur.fetchone() 获取查询到的第一条数据内容,设置字典格式会返回一个字典
# cur.fetchall() 获取查询到的所有数据内容,设置字典格式会返回一个列表嵌套字典
data = cur.fetchone()
print(data) # cursorclass= pymysql.cursors.DictCursor 游标类型参数,如果不传这个参数默认cur.fetchall()得到的是元组,传的话是列表嵌套字典
# (0, '小柠檬', '25D55AD283AA400AF464C76D713C07AD', '13927427491', 0, Decimal('8000.00'), datetime.datetime(2021, 1, 28, 15, 24, 20))
# {'id': 0, 'reg_name': '小柠檬', 'pwd': '25D55AD283AA400AF464C76D713C07AD', 'mobile_phone': '13927427491', 'type': 0, 'leave_amount': Decimal('8000.00'), 'reg_time': datetime.datetime(2021, 1, 28, 15, 24, 20)}
data_all = cur.fetchall() # 特别注意:由于第一行已经被读取,所以fetchall只能读取第一行除外的所有数据
print(data_all)
# 第五步,关闭游标
cur.close()
# 第六步,断开数据库连接
mysql.close()
特别注意:fetchone和fetchall同时存在时且fetchone在前,由于第一行已经被fetchone读取,所以fetchall只能读取第一行除外的所有数据 。
# 第一步,连接数据库
# 第二步,创建一个游标对象,即类似操作数据库的鼠标
# 第三步,执行sql语句
# 第四步,提交事务 (pymysql操作数据库,默认开启了事务,涉及到数据库中数据的变动操作增删改,要提交事务才会生效)
# 第五步,关闭游标
# 第六步,断开数据库连接
import pymysql
# 第一步,连接数据库
mysql = pymysql.connect(host='8.129.91.152',
port=3306, # 端口为数值类型
user='future',
password='123456',
charset='utf8', # 注意使用'utf8',不能使用'utf-8'
cursorclass= pymysql.cursors.DictCursor
# database=None 可在此处指定要操作的库,但是一般在执行sql语句中选择库,因为可能会涉及到多库操作
)
# 第二步,创建一个游标对象,即类似操作数据库的鼠标
cur = mysql.cursor()
# 第三步,执行sql语句
sql = '删除的sql语句'
res = cur.execute(sql)
# 第四步,提交事务,提交后才生效
mysql.commit()
# 如果有涉及到需要清理测试数据可使用TestFixture 测试夹具tearDown.
# 第五步,关闭游标
cur.close()
# 第六步,断开数据库连接
mysql.close()
import pymysql
from common.handle_conf import handle_yaml
class handle_mysql:
# 设置默认连接的数据库
def __init__(self, host=handle_yaml['host'],
port=handle_yaml['port'],
user=handle_yaml['user'],
password=handle_yaml['pwd']):
self.mysql = pymysql.connect(host=host,
port=port,
user=user,
password=password,
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
# 查询第一条数据
def find_fetchone(self, sql):
self.mysql.commit()
cur = self.mysql.cursor()
cur.execute(sql)
data = cur.fetchone()
cur.close()
return data
# 查询所有数据
def find_fetchall(self, sql):
self.mysql.commit()
cur = self.mysql.cursor()
cur.execute(sql)
data = cur.fetchall()
cur.close()
return data
def find_datas(self, sql, one=True):
if one:
return self.find_fetchone(sql)
return self.find_fetchall(sql)
# 关闭连接
def close_mysql(self):
self.mysql.close()
# 创建个数据库连接对象
mysql = handle_mysql()
# sql = 'SELECT * FROM futureloan.member WHERE mobile_phone=15021696060'
# res = mysql.find_datas(sql)
# print(res)
数据库查询及数据库校验
import pymysql
from config.handle_conf import conf
class Mysql():
def __init__(self,host,port,user,password):
self.mysql = pymysql.connect(host=host,
port=port,
user=user,
password=password,
charset='utf8',
cursorclass=pymysql.cursors.DictCursor
)
self.cur = self.mysql.cursor()
def find_data(self,sql):
self.mysql.commit() # 相当重要,每次查询数据前先提交下事务,同步数据库最新数据
self.cur.execute(sql)
return self.cur.fetchall()
mysql = Mysql(host=conf['host'],
port=conf['port'],
user=conf['user'],
password=conf['password'])
# print(mysql.find_data('SELECT mobile_phone FROM futureloan.member LIMIT 3'))
# [{'mobile_phone': '13927427491'}, {'mobile_phone': '13566660002'}, {'mobile_phone': '15690403234'}]
import unittest
import ddt
import os
import requests
import random
from common.handle_mysql import mysql
from common.handle_path import DATA_DIR
from common.handle_excel import handle_excel
from config.handle_conf import conf
from common.handle_log import logger
datas = handle_excel(os.path.join(DATA_DIR, 'testdata.xlsx'), 'lmregister')
base_dir = conf['base_dir']
headers = conf['headers']
@ddt.ddt()
class TestLmregister(unittest.TestCase):
@ddt.data(*datas)
def test_lmregister(self, item):
url = base_dir + item['api']
# if '*phone*' in item['data']:
# phone = str(random.randint(13000000000, 13999999999))
# item['data'] = item['data'].replace('*phone*', phone)
# while '*phone*' in item['data']:
# phone = str(random.randint(13000000000, 13999999999))
# mysql_res = mysql.find_data('SELECT mobile_phone FROM futureloan.member LIMIT 3')
# for i in mysql_res:
# if phone == i['mobile_phone']:
# continue
# item['data'] = item['data'].replace('*phone*', phone)
# break
if '*phone*' in item['data']: # 查询数据做动态参数替换
phone = self.get_phone()
item['data'] = item['data'].replace('*phone*', phone)
data = eval(item['data'])
response = requests.request(method=item['method'], url=url, json=data, headers=headers)
res = response.json()
expected = eval(item['expected'])
try:
self.assertEqual(res['code'],expected['code'])
self.assertEqual(res['msg'],expected['msg'])
if item['check_sql']: # 筛选注册成功的用例做数据库校验
res = mysql.find_data(item['check_sql'].format(data['mobile_phone']))
self.assertTrue(res)
logger.debug(f'{item["case_id"]}{item["title"]}{item["data"]}通过')
except AssertionError as e:
logger.error(f'{item["case_id"]}未通过')
raise e
@staticmethod # 定义个静态方法随机生成手机号并做数据库查询,保证每次跑注册接口的数据是未注册的
def get_phone():
res = True
while res:
phone = str(random.randint(13000000000, 13999999999))
sql = (f'SELECT * FROM futureloan.member WHERE mobile_phone={phone}')
res = mysql.find_data(sql)
return phone