python操作数据库---pymysql

目录

1、安装PyMySQL

2、操作步骤

3、 事务的概念

4、游标

5、建立连接方法

6、异常捕获

1、查询数据库

2、更新数据库

7、数据库工具类的封装

数据库操作的应用场景

  • 校验测试数据

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

  • 构建测试数据

    • 测试数据使用一次就失效了

      • 如添加员工,使用的手机号

    • 测试前无法保证测试数据是否已经存在

      • 如:查询员工接口,使用员工id

1、安装PyMySQL

(1)在dos命令行中安装PyMySQL

pip install PyMySQL

(2)在pycharm中导入PyMySQL

2、操作步骤

1、导包 import pymysql

2、创建连接 conn = pymysql.connect()

3、获取游标 cursor=conn.Cursor()

4、执行SQL cursor.excute("sql语句")

  • 查询语句(select)

    • 处理结果集(提取数据fetch*)

  • 增删改语句(insert,delete、updata)

    • 成功:提交事务 conn.commit()

    • 失败:回滚业务 conn.rollback()

5、关闭游标 cursor.close()

6、关闭连接 conn.close()

3、 事务的概念

  • 事务,是关系型数据库特有的概念

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

  • 事务操作:

    • 提交: conn.commit()

    • 回滚:conn.rollback()

4、游标

python操作数据库---pymysql_第1张图片

常用方法

  • fetchone():从结果集中提取一行

  • fetchmany(size):从结果集中,提取size行

  • fetchall():提取所有结果集

  • 属性rownumber:可以设置游标的位置

注意:由于提取数据时,提取游标的下一行 ,每提一行数据,自动向下,因此在需要重新提取前面的数据时,需要使用rownumber设置游标的位置

5、建立连接方法

conn = pymysql.connect(host="",port=0,
					username="",password="",database="",charset="")
host:数据库所在主机地址 IP地址 - string
port:数据库使用的端口号 端口号 - int
user: 用户名 				
password: 密码
database:数据库名称
charset:字符集  常用utf-8

conn: 连接数据库的对象

入门案例

​ 查询数据库,获得MySQL服务器的版本信息

​ 注意:注意database是数据库名称不是连接名,字符集编码没有-

#导入pymysql
import pymysql

#创建连接
conn = pymysql.connect(host='localhost',port=3306,
                      user='root',password='123456',database='sys',charset='utf8')
#获取游标
cursor = conn.cursor()
#执行sql
cursor.execute("select version()")
#获取结果集
res = cursor.fetchone()
print("当前数据库版本是 "+res[0])
#关闭游标
cursor.close()
#关闭连接
conn.close()

案例二:体会游标的使用

  • 查询sys_config表,获取第一条数据
  • 查询sys_config表,获取前俩条数据
  • 查询sys_config表,获取全部数据
  • 查询sys_config表,获取第3条和第4条数据
#导入pymysql
import pymysql

#创建连接
conn = pymysql.connect(host='localhost',port=3306,
                      user='root',password='123456',database='sys',charset='utf8')
#获取游标
cursor = conn.cursor()
#执行sql
cursor.execute("select * from sys_config ")
#获取第一条数据
res = cursor.fetchone()
print(res)
#获取前俩条数据
cursor.rownumber = 0
res1 = cursor.fetchmany(2)
print(res1)
#获取全部数据
cursor.rownumber = 0
res2 = cursor.fetchall()
print(res2)

#获取第3和第四条数据
cursor.rownumber = 2
res3 = cursor.fetchmany(2)
print(res3)
#关闭游标
cursor.close()
#关闭连接
conn.close()

查询出来的数据内容是元组类型,多条数据的话就是元组嵌套元组。

('1号', 'bbb', datetime.datetime(2023, 2, 23, 22, 4, 19), None)
(('1号', 'bbb', datetime.datetime(2023, 2, 23, 22, 4, 19), None), ('22号', '周三', datetime.datetime(2022, 10, 27, 23, 52, 59), None))
(('1号', 'bbb', datetime.datetime(2023, 2, 23, 22, 4, 19), None), ('22号', '周三', datetime.datetime(2022, 10, 27, 23, 52, 59), None), ('23号', '周末', datetime.datetime(2023, 2, 23, 23, 52, 59), None), ('25号', '周日', datetime.datetime(2022, 10, 27, 21, 28, 30), None), ('diagnostics.allow_i_s_tables', 'OFF', datetime.datetime(2022, 10, 23, 21, 6, 8), None), ('diagnostics.include_raw', 'OFF', datetime.datetime(2022, 10, 23, 21, 6, 8), None), ('ps_thread_trx_info.max_length', '65535', datetime.datetime(2022, 10, 23, 21, 6, 8), None), ('statement_performance_analyzer.limit', '100', datetime.datetime(2022, 10, 23, 21, 6, 8), None), ('statement_performance_analyzer.view', None, datetime.datetime(2022, 10, 23, 21, 6, 8), None), ('statement_truncate_len', '64', datetime.datetime(2022, 10, 23, 21, 6, 8), None))
(('23号', '周末', datetime.datetime(2023, 2, 23, 23, 52, 59), None), ('25号', '周日', datetime.datetime(2022, 10, 27, 21, 28, 30), None))

6、异常捕获

1、查询数据库

#导入pymysql
import pymysql
conn = None
cursor = None
try:
    # 创建连接
    conn = pymysql.connect(host='localhost', port=3306,
                           user='root', password='123456', database='sys', charset='utf8')
    # 获取游标
    cursor = conn.cursor()
    # 执行sql
    cursor.execute("select * from sys_config ")
    # 获取第一条数据
    res = cursor.fetchone()
    print(res)
    # 获取前俩条数据
    cursor.rownumber = 0
    res1 = cursor.fetchmany(2)
    print(res1)
    # 获取全部数据
    cursor.rownumber = 0
    res2 = cursor.fetchall()
    print(res2)

    # 获取第3和第四条数据
    cursor.rownumber = 2
    res3 = cursor.fetchmany(2)
    print(res3)
except Exception as err:
    print("执行sql出错,错误是 "+str(err))
finally:
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

2、更新数据库

python操作数据库---pymysql_第2张图片

新增一条记录示例,修改删除同理  

#1、导入pymysql
import pymysql

conn = None
cursor = None
try:
    # 2、创建连接
    conn = pymysql.connect(host="localhost",port=3306,
                           user="root",password="123456",database="sys",charset="utf8")
    # 3、获取游标
    cursor = conn.cursor()
    # 4、执行添加sql语句
    cursor.execute("insert into `sys_config`(variable,`value`) VALUES ('26号','周三')")
    #查看sql语句影响了多少行
    print("影响行数",conn.affected_rows())
    # 5、事务提交
    conn.commit()

except Exception as err:
    #数据回滚
    conn.rollback()
    print("错误是"+str(err))
finally:
	# 6、关闭游标
    cursor.close()
    # 7、关闭连接
    conn.close()

7、数据库工具类的封装

封装的目的

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

封装创建连接和关闭连接

import pymysql
class DButil():
    #添加类属性
    conn = None
    #创建连接
    @classmethod
    def __getConn(cls):
        #判断连接是否为空
        if cls.conn is None:
            cls.conn = pymysql.connect(host="localhost",port=3306,
                               user="root",password="123456",database="sys",charset="utf8")
        return cls.conn

    #关闭连接
    @classmethod
    def __connClose(cls):
        if cls.conn is not None:
            cls.conn.close()
            cls.conn = None

封装查询一条

  #查询获取一条
    @classmethod
    def select_getOne(cls,sql):
        cursor = None
        res = None
        try:
            # 创建连接
            cls.conn = cls.__getConn()
            # 获取游标
            cursor = cls.conn.cursor()
            # 执行sql语句
            cursor.execute(sql)
            res = cursor.fetchone()
            
        except Exception as error:
            print("查询错误",str(error))
          
        finally:
            cursor.close()
            DButil.__getConn()
            return res

封装修改、删除、新增

 #修改、新增、删除
    @classmethod
    def uid_db(cls,sql):
        cursor = None
        try:
            cls.conn = cls.__getConn()
            cursor = cls.conn.cursor()
            cursor.execute(sql)
            print("影响了"+str(cls.conn.affected_rows())+"行")
            cls.conn.commit()
        except Exception as error:
            cls.conn.rollback()
            print("出现问题是",error)
        finally:
            cursor.close()
            cls.conn.close()

完整代码实现,并对查询、新增进行测试

#pysql操作数据库的封装
#在函数名前加__是创建私有方法
#方法前面加 @classmethod,说明该方法是类方法,可以通过类名调用
import pymysql
class DButil():
    #添加类属性
    conn = None
    #创建连接
    @classmethod
    def __getConn(cls):
        #判断连接是否为空
        if cls.conn is None:
            cls.conn = pymysql.connect(host="localhost",port=3306,
                               user="root",password="123456",database="sys",charset="utf8")
        return cls.conn

    #关闭连接
    @classmethod
    def __connClose(cls):
        if cls.conn is not None:
            cls.conn.close()
            cls.conn = None


    #查询获取一条
    @classmethod
    def select_getOne(cls,sql):
        cursor = None
        res = None
        try:
            # 创建连接
            cls.conn = cls.__getConn()
            # 获取游标
            cursor = cls.conn.cursor()
            # 执行sql语句
            cursor.execute(sql)
            res = cursor.fetchone()
        except Exception as error:
            print(error)
        finally:
            cursor.close()
            cls.__connClose()
            return res

    #修改、新增、删除
    @classmethod
    def uid_db(cls,sql):
        cursor = None
        try:
            cls.conn = cls.__getConn()
            cursor = cls.conn.cursor()
            cursor.execute(sql)
            print("影响了"+str(cls.conn.affected_rows())+"行")
            cls.conn.commit()
        except Exception as error:
            cls.conn.rollback()
            print("出现问题是",error)
        finally:
            cursor.close()
            cls.__connClose()


if __name__ == "__main__":
    res = DButil.select_getOne("select * from sys_config where variable = 'statement_performance_analyzer.view'")
    print(res)
    DButil.uid_db("insert into `sys_config`(variable,`value`) VALUES ('26号','周三')")

你可能感兴趣的:(自动化之路,python,数据库)