Python操作数据库-程序员宅基地

技术标签: python  数据库  

在功能、接口测试中常常需要通过数据库的操作,来准备数据、检测环境及核对功能、接口的数据库操作是否正确。

在自动化测试中,就需要我们用代码连接数据库自动完成数据准备、环境检查及数据库断言的功能。
使用Python操作MySQL数据库这里我们需要用到三方库PyMySQl

安装方法:pip install pymysql

1、数据库操作

  1. 建立数据库连接                                             conn = pymysql.connect()
  2. 从连接建立操作游标                                      cur = conn.cursor()
  3. 使用游标执行sql(读/写)                             cur.execute(sql)
  4. 获取结果(读)/ 提交更改(写)                  cur.fetchall() / conn.commit()
  5. 关闭游标及连接                                             cur.close();conn.close()
import pymysql
# 1. 建立连接
conn = pymysql.connect(
                host='192.168.255.211',
                port=3306,
                user='root',
                passwd='123456',      # password也可以
                db='hellodb',
                charset='utf8')     # 如果查询有中文需要指定数据库编码             
# 2. 从连接建立游标(有了游标才能操作数据库)
cur = conn.cursor()
# 3. 查询数据库(读)
cur.execute("select * from hellodb where name='张三'")
# 4. 获取查询结果
result = cur.fetchall()
print(result)
# 3. 更改数据库(写)
cur.execute("delete from hellodb where name='李四'")
# 4. 提交更改
conn.commit()  # 注意是用的conn不是cur
# 5. 关闭游标及连接
cur.close()
conn.close()

1.1、查询操作

使用cur.execute(),执行数据库查询后无返回的是影响的行数,而非查询结果。

我们要使用cur.fetchone() / cur.fetchmany() / cur.fetchall()来获取查询结果

(1)cur.fetchone(): 获取一条数据(同时获取的数据会从结果集删除),返回元祖('张三','123456')

(2)cur.fetchmany(3): 获取多条数据,返回嵌套元祖(('张三','123456'),('李四','123456'),("王五","123456"))

(3)cur.fetchall(): 获取所有数据,返回嵌套元祖,(('张三','123456'),)(只有一条数据时)

获取完数据后,数据会从数据集中删除,再次获取获取不到,所以我们需要重复使用查询结果时,

需要将查询结果赋给某个变量

cur.execute(select * from hellodb where name='张三')
result = cur.fetchall()
print(result)  # 结果: ('张三','123456')
print(result)  # 结果: ('张三','123456')

2、封装数据库操作

由于经常要使用到数据库操作,建议将所有数据库操作封装成公用的数据库模块

# 新建db.py

# 获取连接方法
import pymysql
# 获取连接方法
def get_db_conn():
    conn = pymysql.connect(
                   host='192.168.255.211',
                   port=3306,
                   user='root',
                   passwd='123456',  # password也可以
                   db='hellodb',
                   charset='utf8')  # 如果查询有中文需要指定数据库编码
    return conn
# 封装数据库查询操作
def query_db(sql):
    conn = get_db_conn()  # 获取连接
    cur = conn.cursor()  # 建立游标
    cur.execute(sql)  # 执行sql
    result = cur.fetchall()  # 获取所有查询结果
    cur.close()  # 关闭游标
    conn.close()  # 关闭连接
    return result  # 返回结果


# 封装更改数据库操作
def change_db(sql):
    conn = get_db_conn()  # 获取连接
    cur = conn.cursor()  # 建立游标
    try:
        cur.execute(sql)  # 执行sql
        conn.commit()  # 提交更改
    except Exception as e:
        conn.rollback()  # 回滚
    finally:
        cur.close()  # 关闭游标
        conn.close()  # 关闭连接


# 封装常用数据库操作
def check_user(name):
    # 注意sql中''号嵌套的问题
    sql = "select * from user where name = '{}'".format(name)
    result = query_db(sql)
    return True if result else False


def add_user(name, password):
    sql = "insert into user (name, passwd) values ('{}','{}')".format(name, password)
    change_db(sql)


def del_user(name):
    sql = "delete from user where name='{}'".format(name)
    change_db(sql)

相比用例中直接使用sql操作数据库,封装常用的数据库操作会更安全

  1. 调用方法(其他模块)
from db import *

if check_user("张三"):
    del_user("张三")

补充:另一种封装方法

由于上面这种封装方法,每一次查询都会建立一次数据库连接,效率较低,也可以采用下面面向对象的封装方法

# 新建db1.py
import pymysql

class DB:
    def __init__(self):
        self.conn = pymysql.connect(
                   host='192.168.255.211',
                   port=3306,
                   user='root',
                   passwd='123456',   # passwd 不是 password
                    db='api_test')
        self.cur = self.conn.cursor()
        
    def __del__(self): # 析构函数,实例删除时触发
        self.cur.close()
        self.conn.close()
        
    def query(self, sql):
        self.cur.execute(sql)
        return self.cur.fetchall()
    
    def exec(self, sql):
        try:
            self.cur.execute(sql)
            self.conn.commit()
        except Exception as e:
            self.conn.rollback()
            print(str(e))
    
    def check_user(self,name):
        result = self.query("select * from user where name='{}'".format(name))
        return True if result else False
        
    def del_user(self, name)
        self.exec("delete from user where name='{}'".format(name))
        

使用方法:

from db1 import DB:

db = DB()  # 实例化一个数据库操作对象
if db.check_user("张三"):
    db.del_user("张三")

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huo130125/article/details/124248704

智能推荐

继续聊WPF——设置网格控件列标题的样式-程序员宅基地

文章浏览阅读141次。继续聊WPF——设置网格控件列标题的样式 原文:继续聊WPF——设置网格控件列标题的样式 我很奇怪的是,微软那厮是怎么搞的,Blend里面居然不能编辑GridView的样式,十万般无奈之下,只好手写XAML来处理了。要想知道一个控件的样式..._wpf gridviewcolumnheader

java 打印异常堆栈_Java:打印异常信息与调用堆栈到控制台-程序员宅基地

文章浏览阅读2.9k次。Java语言的异常类Exception包含着异常的全部信息。现设异常的实例名为ex,所有的异常都是一个除以0的表达式(int i = 1 / 0)所触发的:1、通过ex.getMessage()可以获取异常信息,如/ by zero2、通过ex.toString()可以获取异常类型和异常信息,如java.lang.ArithmeticException: / by zero3、通过ex.print..._java打印异常堆栈

常用手势(敲击)(拖拽)(长按)(轻扫)(捏合)(选转)_长按后拖拽的交互手势-程序员宅基地

文章浏览阅读1.3k次。/***************************************************** * * 一、使用手势时,一定要开启 !!!!!!!!!!!!!!!! * 1 .userInteractionEnabled (用户交互活着) * 2 .multipleTouchEnabled (多点触控) * * 二、几种常用的手势: * 1.UITapGes_长按后拖拽的交互手势

十套Substance视频教程_substance academy-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏16次。1. Substance Academy - Getting Started With Substance Painter 2018出自官方Substance Academy,关于Substance Painter 2018的最新教程,通过一个制作煤油灯的实例项目,讲解了Substance Painter 2018的基础操作。12课时,时长2小时56分钟。2. Substa..._substance academy

Windows32位系统下 Vs2015 配置Opencv_vs2015编译opencv32位-程序员宅基地

文章浏览阅读3.4k次,点赞7次,收藏21次。Win8 32位系统配置Opencv参考文章:https://blog.csdn.net/yefcion/article/details/81067030本人系统环境:win8 32位opencv-3.4.0-vc14_vc15vs2015professional欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Ma..._vs2015编译opencv32位

北京计算机应用中级,计算机应用教程(中级)-程序员宅基地

文章浏览阅读110次。本书的目的是让读者了解计算机应用基础知识,掌握计算机应用基本技能,能够较为熟练地使用计算机来处理日常工作和初步处理与专业相关的问题。本书适合各级、各类学校“计算机应用基础”类课程的教学和自学使用。¥26.30定价:¥31.00(8.49折)/2010-09-01完善的知识体系:每章开始会对本章内容的考试情况进行介绍,如分值、重难点内容等;然后通过 本章知识体系一览表 将本章所有内容进行归纳汇总,使..._中级计算机北京

随便推点

Python____初识+单线程爬虫_python爬虫单线程爬取浪潮优派信息网-程序员宅基地

文章浏览阅读397次。————————————————Python语法初识————————————————#coding=utf-8#上面代码含义是改变编码 使Python文件内可以包含中文__author__ = 'Administrator'import re# #是单行注释# ''' 3引号可以保存内容的换行等格式 本来是用作字符串 如" " 和' '都是用来标注字符串的。 但_python爬虫单线程爬取浪潮优派信息网

Pandas与NumPy区别以及dataframe和ndarray对象转换_dataarray转换成numpy-程序员宅基地

文章浏览阅读6.3k次,点赞6次,收藏32次。区别Pandas 和 NumPy 被认为是科学计算与机器学习中必不可少的库,因为它们具有直观的语法和高性能的矩阵计算能力。下面对 Pandas 与 NumPy 进行简单的总结,如下表所示:比较项 Pandas NumPy 适应性 Pandas主要用来处理类表格数据。 NumPy 主要用来处理数值数据。 工具 Pandas提供了Series和DataFrame数据结构。 NumPy 构建了 ndarray array来容纳数据。 性能 Pandas_dataarray转换成numpy

leecode-110-平衡二叉树_平衡二叉树 完整实现 leecode-程序员宅基地

文章浏览阅读50次。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) {.._平衡二叉树 完整实现 leecode

springboot 手动注入bean_springboot手动注入bean-程序员宅基地

文章浏览阅读8.7k次,点赞2次,收藏4次。首先说明一下 完全可以在加载的时候注入进去 完全没必要自己手动注入,这篇文章就是自己闲没事写的spring 有一个核心的类 DefaultListableBeanFactory里边存放了我们需要的一切,我们可以从这里边获取bean对象,也可以手动注入bean对象@Componentpublic class ContextAware implements ApplicationContextAware { @Autowired DefaultListableBeanFactory bean_springboot手动注入bean

高清录播系统服务器,智慧教室高清录播服务器 高清录播系统 真正零布线 即装即用...-程序员宅基地

文章浏览阅读886次。高清录播服务器对校长的意义:使用录播系统有利于校长对学校的教学状况进行信息化教学监督,从而提高学校教学管理效能,增加学校知名度。全面提升学校的软硬件的信息化环境;精确掌握学校办学条件水平的有形资源;精确掌握教师资源的水平及分布;精确掌握教育资源的分布情况;为教育均衡化发展提供决策支持数据;为学校发展提供指导和建议;为区域内的教师提供自我成长和发展的平台;开放的优质教育资源为学生家长提供服务;为学校..._智能高清录播系统点录制显示验证证书失败

国内计算机视觉与机器学习研究团队_浙工大计算机视觉所-程序员宅基地

文章浏览阅读3.8k次。浙江工业大学---智能系统研究所---计算机视觉与图像处理研究组陈胜勇所长http://www.tdc.zjut.edu.cn/UTADB/teacher/search_one_intro.jsp?teacher_id=0343推荐几个机器学习和数据挖掘领域相关的中国大牛:http://blog.csdn.net/playoffs/article/details/7588597计算机视_浙工大计算机视觉所

推荐文章

热门文章

相关标签