简单封装了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’
所以需要确保数据库能够连接,并且连接信息正确,或者根据需要,将连接对象和游标的关闭封装成自定义函数。