基于Pymysql的数据库的增删改查模版(4)——删除
最近在利用Pymysql进行数据库交互时,为了提高程序的可扩展性,实现了一套基本的数据库查询、插入、更新、删除模版,记录下来供日后使用
ps:考虑到文章的独立阅读性,保持了一些重复的内容
环境
Mysql 5.7.2 理论上对于数据库版本没有特殊要求
pymsql 0.9.3
python >= 3.6 保证格式化字符串的使用
Mysql删除操作语法
DELEDE FROM `tablename`
WHERE field1=value1 AND field2=value2 AND ... AND fieldN=valueN
数据库删除:类模版实现
初始化
class DeleteDB:
def __init__(self):
self.db = pymysql.connect('localhost', 'root', 'password', 'database_name')
self.cursor = self.db.cursor()
初始化部分涉及到数据库的连接,这一部分比较简单,主要是创建游标对象self.cursor
,用于执行SQL语句
更新事务基本框架
def modify_query(self, query):
try:
self.cursor.execute(query)
self.db.commit()
return True
except Exception as error:
self.db.rollback()
return str(error)
这一部分使用游标对象执行SQL语句,正确执行后commit结果至数据库,出现错误时进行rollback,并返回错误信息,比较简单
更新指定记录
设定为按照给定的顺序进行插入
def delete_info(self, tablename, **kwargs):
"""
:param tablename: 被删除记录的数据库表名
:param kwargs:
"""
pattern = lambda k: "'" + str(k).replace("'", "\\'") + "'"
items = ['`' + item[0] + '` = ' + pattern(item[1]) for item in kwargs.items()]
query = f"""DELETE FROM {'`' + tablename + '`'} WHERE ( {(' AND '.join(items))} );"""
result = self.modify_query(query)
return result
更新的关键有三个部分,分别是:
- python的lambda表达式,用于对传入字段进行预处理
- python的函数的可变参数
- python的格式化字符串,也就是
f'xxx'
类型的字符串
下面讲解一下SQL语句生成的部分:
**kwargs
参数实际传入一个字典类型的变量,包含了WHERE子句筛选的条件
{
'field1':'value1',
'field2':'value2',
...
'fieldN':'valueN'
}
- 通过
列表生成式
以及lambda
表达式共同作用*kwargs
生成需要WHERE子句筛选条件,如下所示
["`field1`= 'value1'", "`field2` = 'value2'",..., "`fieldN`= 'valueN'"]
- 通过
' AND '.join()
即可将其拼接成为如下字符串
"`field1`= 'value1' AND `field2` = 'value2' AND ... AND `fieldN`= 'valueN'"
⚠️,此处的AND
两端各有一个空格,以保证正确的连接筛选条件
- 生成SQL删除语句
DELEDE FROM `tablename`
WHERE field1=value1 AND field2=value2 AND ... AND fieldN=valueN
完整代码
import pymysql
class DeleteDB:
def __init__(self):
self.db = pymysql.connect('localhost', 'root', 'mk123456', 'ST')
# self.db = pymysql.connect('localhost', 'root', 'password', 'database_name')
self.cursor = self.db.cursor()
# 管理基本框架
def modify_query(self, query):
try:
self.cursor.execute(query)
self.db.commit()
return True
except Exception as error:
self.db.rollback()
return str(error)
def delete_info(self, tablename, **kwargs):
"""
:param tablename: 被删除记录的数据库表名
:param kwargs:
"""
pattern = lambda k: "'" + str(k).replace("'", "\\'") + "'"
items = ['`' + item[0] + '` = ' + pattern(item[1]) for item in kwargs.items()]
query = f"""DELETE FROM {'`' + tablename + '`'} WHERE {(' AND '.join(items))} ;"""
result = self.modify_query(query)
return result
调用示例
deletedb = DeleteDB()
result = deletedb.delete_info('tablename', field=value1,
field2=value2,...,fieldN=valueN)
其中:
-
tablename
为待删除记录所在的表名 -
field
是WHERE子句筛选的属性列名 -
value
是WHERE子句筛选的属性列值