利用pymysql对mysql进行增删改查

简单封装了pymysql的方法,形成了自己的Mysql工具类:

import pymysql


class Mysql(object):

    def __init__(self, host="127.0.0.1", port=3306, user="root", password="", database=None, charset="utf8",
                 cursor_type=pymysql.cursors.DictCursor):
        self.host = host
        self.port = port
        self.user = user
        self.password = password
        self.database = database
        self.charset = charset
        self.cursor_type = cursor_type
        # 连接数据库
        self.connect()

    def connect(self):
        # 创建连接
        self.con = pymysql.connect(host=self.host,
                                   user=self.user,
                                   password=self.password,
                                   database=self.database,
                                   charset=self.charset,
                                   port=self.port)
        # 创建游标
        self.cursor = self.con.cursor(cursor=self.cursor_type)

    def fetchall(self, sql, args=None):
        """根据指定的cursor_type返回查询结果,用args=None防止sql注入"""
        try:
            # 使用游标发送sql
            self.cursor.execute(sql, args)
            # 获取结果
            return self.cursor.fetchall()
        except Exception as err:
            print(f"执行出错了,错误信息:{err}")

    def execute(self, sql, args=None):
        """执行增/删/改/查操作,返回受影响行数
               :param str sql:待执行的sql语句
               :param args: 用于查询的参数(可选)
               :type args: tuple, list , dict(用args=None防止sql注入)

               :return: 受影响的行数
               :rtype: int

               如果参数 args 是 list 或 tuple, 在sql语句中使用 %s 作为占位符
               如果参数 args 是 dict,在sql语句中使用 %(keyname)s 作为占位符
        """
        try:
            # 开启事务
            self.con.begin()
            # 使用游标发送sql指令
            num = self.cursor.execute(sql, args)  # 获取受影响行数
        except Exception as err:
            print(f"执行出错了,错误信息:{err}")
            self.con.rollback()
        else:
            self.con.commit()
            # 返回受影响的行数
            return num

    def __del__(self):
        self.cursor.close()
        self.con.close()

调用举例:
本地的mysql中,woniubook数据库中有一张customer表:
在这里插入图片描述
1、查询

1.1、实例化一个Mysql对象,游标返回类型为默认的字典,sql语句采用tuple形式的占位符

db = Mysql(database='woniubook')
# 查询
result = db.fetchall('select * from customer where age=%s and address=%s', args=(5, '成都'))
print(result)

查询结果为:
[{‘customerid’: 5, ‘username’: ‘王小鹏’, ‘phone’: ‘15112345678’, ‘address’: ‘成都’, ‘age’: 5}]

1.2、实例化一个Mysql对象,游标返回类型为元组,sql语句采用dict形式的占位符

db = Mysql(database='woniubook',cursor_type=pymysql.cursors.Cursor)
result = db.fetchall('select * from customer where address=%(addr)s', args={'addr': '重庆'})
print(result)

查询结果为:
((6, ‘文小玉’, ‘15212345678’, ‘重庆’, 6), (14, ‘吴大朋’, ‘18812345678’, ‘重庆’, 6))

2、删除

db = Mysql(database='woniubook')
result=db.execute('delete from customer where username=%s',args=('杨小宁'))
print(result)

执行结果为:1
查看表中杨小宁这条数据已被删除:
在这里插入图片描述
3、修改

db = Mysql(database='woniubook')
result=db.execute('update customer set age=%s WHERE username=%s', args=(20, '靳小杰'))
print(result)

执行结果为:1
查看表中靳小杰的年龄被改为20:
在这里插入图片描述
4、增加

db = Mysql(database='woniubook')
result=db.execute('insert into customer values(15,"周大名","12312341234","广州",18);')
print(result)

执行结果:1
查看表中新增一条周大明的记录:
在这里插入图片描述
注意:
Mysql类中__del__方法是有一点问题的:
在这里插入图片描述
当数据库未连接上,回收类的空间时,会自动执行__del__方法,此时会报错:
AttributeError: ‘Mysql’ object has no attribute ‘cursor’
所以需要确保数据库能够连接,并且连接信息正确,或者根据需要,将连接对象和游标的关闭封装成自定义函数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值