python操作mysql,参数动态替换和数据库校验(提交事务)

本文介绍如何使用Python的pymysql库连接MySQL数据库,包括连接数据库、执行SQL语句、获取查询结果等步骤,并提供示例代码。
# 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值