pymysql 操作数据库

一、数据库操作应用场景

  1、检验测试数据

    接口发送请求后明确会对数据库中的某个字段进行修改,但响应结果中无该字段数据时。

      如:ihrm 删除员工接口。 is_delete 字段,没有在响应结果中出现! 需要借助数据库校验!
  2、构造测试数据
    测试数据使用一次就失效。
      如:ihrm 添加员工接口,使用的手机号!
    测试前,无法保证测试数据是否存在。
      如:ihrm 查询员工接口,使用的员工 id
 
二、操作数据库
  1、操作流程
1. 导包 import pymysql
2. 创建连接。 conn = pymysql.connect(host,port, user, password, database, charset)
3. 获取游标。 cursor = conn.cursor()
4. 执行 SQL。 cursor.execute( ”sql语句“ )
  查询语句(select)
  处理结果集(提取数据 fetch*)
  增删改语句(insert、update、delete)
  成功:提交事务 conn.commit()
  失败:回滚事务 conn.rollback()
5. 关闭游标。cursor.close()
6. 关闭连接。conn.close()

#####解释
conn = pymysql.connect(host="", port=0, user="", password="", database="", charset="") 
host:数据库所在主机 IP地址 - string 
port:数据库使用的 端口号 - int 
user:连接数据库使用的 用户名 - string 
password:连接数据库使用的 密码 - string 
database:要连接的那个数据库的名字 - string 
charset:字符集。常用 utf8 - string 
conn:连接数据库的对象。

 

  2、事物介绍

    事务,是关系型数据库(mysql)特有的概念。

    事务,可以看做一个虚拟的 容器,在容器中存放一系列的数据库操作,看做一个整体。内部的所有操作,要么都一次性全部成功,只要有一个失败,就全部失败!

    事务操作:只有 2 种情况

      提交:conn.commit()
      回滚: conn.rollback()
  3、游标简介

 

 

  4、连接数据库
    提取数据(都是从游标位置后面第一条开始)
      fetchone():从结果集中,提取一行。
      fetchmany(size):从结果集中,提取 size 行。
      fetchall():提取所有结果集。(提取游标后面的所有数据)
      属性rownumber:可以设置游标位置。
# 1. 导包 
import pymysql

# 定义全局变量,初值为 None
conn = None 
cursor = None 
try:
# 2. 建立连接 
    conn = pymysql.connect(host="211.103.136.244", port=7061, user="student", password="iHRM_student_2021", database="test_db", charset="utf8") 

# 3. 获取游标 
    cursor = conn.cursor() # 指向 0 号位置。 

# 4. 执行 sql 语句(查询)--- t_book 
    cursor.execute("select * from t_book;") 

# 5. 获取结果 - 提取第一条 
    res1 = cursor.fetchone() 
   print("res1 =", res1) # 修改游标位置:回零 cursor.rownumber = 0 # 5. 获取结果 - 提取前 2 条 res2 = cursor.fetchmany(2) print("res2 =", res2) # 修改游标位置:回零 cursor.rownumber = 0 res3 = cursor.fetchall() print("res3 =", res3) # 修改游标位置:指向第 2 条记录 cursor.rownumber = 2 res4 = cursor.fetchmany(2) print("res4 =", res4) except Exception as err: print("查询语句执行出错:", str(err)) finally: # 6. 关闭游标 cursor.close() # 7. 关闭连接 conn.close()

 

 四、数据库增删改查操作
  
   案例:

  单独实现如下操作: ①:新增一条图书数据(id:5 title:西游记 pub_date:1986-01-01 ) ②:把图书名称为‘西游记’的阅读量加一 ③:删除名称为‘西游记’的图书

   1、插入
# 1. 导包 
import pymysql 

# 定义全局变量 
conn = None 
cursor = None 
try:
# 2. 创建连接 
    conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",password="iHRM_student_2021",database="test_db", charset="utf8") # 

3. 获取游标     
    cursor = conn.cursor() 
# 4. 执行 insert 语句
cursor.execute("insert into t_book(id, title, pub_date) values(175, '西游记', '1986-01- 01');") 
# 查看 sql执行,影响多少行 
    print("影响的行数:", conn.affected_rows()) 
# 5. 提交事务 
    conn.commit() 
except Exception as err: 
    print("插入数据错误:", str(err)) 
    # 回滚事务 conn.rollback() 
finally: 
# 6. 关闭游标 
    cursor.close() 
# 7. 关闭连接 
    conn.close()

  2、修改

""" 把图书名称为‘西游记’的阅读量加一 update t_book set `read` = `read` + 1 where id = 6; 
1. 导包 
2. 建立连接 
3. 获取游标 
4. 执行 update 语句 
5. 提交、回滚事务 
6. 关闭游标 
7. 关闭连接 """ 
# 1. 导包 
import pymysql 
conn = None 
cursor = None 
try:
# 2. 建立连接 
    conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",password="iHRM_student_2021",database="test_db", charset="utf8") 

# 3. 获取游标 
    cursor = conn.cursor() 
# 4. 执行 update语句。字段名,需要使用 反引号(`)包裹  
    cursor.execute("update t_book set `read` = `read` + 1 where id = 1023;")
    print("影响的行数:", conn.affected_rows()) 
# 5. 提交、回滚事务 
    conn.commit() 
except Exception as err: 
    print("更新失败:", str(err)) 
    # 回滚事务 
    conn.rollback() 
finally: #     
    6. 关闭游标 
    cursor.close() 
    # 7. 关闭连接 
    conn.close()

  3、删除

""" 删除名称为‘西游记’的图书 delete from t_book where title = '西游记'; 
1. 导包 
2. 建立连接 
3. 获取游标 
4. 执行 delete 语句 
5. 提交、回滚事务 
6. 关闭游标 
7. 关闭连接 """ 
# 1. 导包 
import pymysql 
conn = None 
cursor = None 
try:
# 2. 建立连接 
    conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",password="iHRM_student_2021",database="test_db", charset="utf8") 
# 3. 获取游标 
cursor = conn.cursor() 

# 4. 执行 delete语句。 
    cursor.execute("delete from t_book where id = 151;") 
    print("影响的行数:", conn.affected_rows()) 
# 5. 提交、回滚事务 
    conn.commit()
except Exception as err: 
    print("更新失败:", str(err)) 
    # 回滚事务 
    conn.rollback() 
finally: 
    # 6. 关闭游标 
    cursor.close() 
    # 7. 关闭连接 
    conn.close()

 

五、数据库工具类的封装

  1、封装目的

    将 常用的数据库操作,封装到 一个方法。 后续再操作数据库时,通过调用该方法来实现。提高代码的 复用性!

  2、设计数据库工具类

 

# 封装数据库工具类 
class DBUtil(object): 
    @classmethod 
    def __get_conn(cls): 
        pass 
    @classmethod 
    def __close_conn(cls): 
        pass 
    # 常用方法:查询一条 
    @classmethod 
    def select_one(cls, sql): 
        pass 

    # 常用方法:增删改 
    @classmethod 
    def uid_db(cls, sql): 
        pass    

 

 

六、完整封装代码(查询不需要提交和回滚事务。增删改需要成功提交事物,失败回滚事务)

import pymysql
# 封装数据库工具类
class DBUtil(object):
# 添加类属性
    conn = None
    @classmethod
    def __get_conn(cls):       #为了不让用户看到,设置为私有方法
    # 判断 conn 是否为空,如果是,再创建
        if cls.conn is None:
            cls.conn = pymysql.connect(host="211.103.136.244", port=7061, user="student", password="iHRM_student_2021", database="test_db", charset="utf8")
            # 返回 非空连接
        return cls.conn
    @classmethod
    def __close_conn(cls):
    # 判断,conn 不为空,需要关闭。
        if cls.conn is not None:
            cls.conn.close()
            cls.conn = None    #上一步cls.conn.close()关闭连接后,就需要重置conn。

    # 常用方法:查询一条
    @classmethod
    def select_one(cls, sql):
        cursor = None
        res = None
        try:
            # 获取连接(获取私有方法)
            cls.conn = cls.__get_conn()
            # 获取游标
            cursor = cls.conn.cursor()
            # 执行 查询语句
            cursor.execute(sql)
            # 提取一条结果
            res = cursor.fetchone()
        except Exception as err:
            print("查询sql错误:", str(err))
        finally:
            # 关闭游标
               cursor.close()
            # 关闭连接
               cls.__close_conn()
            # 将查询sql执行的 结果,返回
               return res

    # 常用方法:增删改
    @classmethod
    def uid_db(cls, sql):
        cursor = None
        try:
            # 获取连接
                cls.conn = cls.__get_conn()
            # 获取游标
                cursor = cls.conn.cursor()
            # 执行 uid 语句
                cursor.execute(sql)
                print("影响的行数:", cls.conn.affected_rows())
            # 提交事务
                cls.conn.commit()
        except Exception as err:
            # 回滚事务
            cls.conn.rollback()
            print("增删改 SQL 执行失败:", str(err))
        finally:
            # 关闭游标
            cursor.close()
            # 关闭连接
            cls.__close_conn()

if __name__ == '__main__':
    res = DBUtil.select_one("select * from t_book;")        #调用类方法,直接类名加方法
    print("查询结果为:", res)
    DBUtil.uid_db("update t_book set is_delete = 1 where id = 1111;")

 

 

 

 
 
 
 
 
 
 
 
posted @ 2023-04-11 17:04  新入世界的小白  阅读(137)  评论(0)    收藏  举报