基于Pymysql的数据库的增删改查模版(1)——单表查询
最近在利用Pymysql进行数据库交互时,为了提高程序的可扩展性,实现了一套基本的数据库查询、插入、更新、删除模版,记录下来供日后使用
ps:考虑到文章的独立阅读性,保持了一些重复的内容
环境
Mysql 5.7.2 理论上对于数据库版本没有特殊要求
pymsql 0.9.3
python >= 3.6 保证格式化字符串的使用
Mysql查询操作语法
- 查询单表的指定属性列全部记录
SELECT `field1`, `field2`,...,`fieldN` FROM `tablename`
数据库查询:类模版实现
初始化
class QueryDB:
def __init__(self):
self.db = pymysql.connect('localhost', 'root', 'password', 'database_name')
self.cursor = self.db.cursor()
初始化部分涉及到数据库的连接,这一部分比较简单,主要是创建游标对象self.cursor
,用于执行SQL语句
查询基本框架
def execute_query(self, query):
try:
self.cursor.execute(query)
return self.cursor.fetchall()
except Exception as error:
self.db.rollback()
return error
这一部分使用游标对象执行SQL语句,出现错误时进行rollback,并返回错误信息,比较简单
单表查询指定属性
# 获取特定表的指定属性的全部记录
def get_specified_records(self, tablename, *args):
"""
:param tablename: 查询的表名
:param args: 可变参数——查询的属性列
:return: 数据库查询结果
"""
# 根据表名以及属性列值进行数据库查询SQL语句生成
query = f'''SELECT {','.join('`' + field + '`' for field in args)}
FROM {'`' + tablename + '`'};'''
return self.execute_query(query)
查询的关键有两个部分,分别是:
- python函数的可变参数
- python格式化字符串,也就是
f'xxx'
类型的字符串
下面讲解一下SQL语句生成的部分:
*args
参数实际传入一个元组类型的变量,包含了属性列的名称,通过列表生成式
遍历这一变量即可创建查询的属性列
'`' + field + '`' for field in args
- 生成如下列表
['`field1`', '`field2`',...,'`fieldN`']
- 通过
','.join()
即可将其拼接成为如下字符串
"`field1` , `field2`' ,..., `fieldN`"
- 生成SQL查询语句
SELECT `field1` , `field2` ,..., `fieldN`' FROM `tablename`;
考虑传入的*args
参数包含表中全部属性列,则该SQL语句完成查询单表全部记录。
完整代码
class QueryDB:
def __init__(self):
self.db = pymysql.connect('localhost', 'root', 'xxx', 'xxx')
self.cursor = self.db.cursor()
# 查询基本框架
def execute_query(self, query):
try:
self.cursor.execute(query)
return self.cursor.fetchall()
except Exception as error:
self.db.rollback()
return error
# 获取特定表的指定属性的全部记录
def get_specified_records(self, tablename, *args):
"""
:param tablename: 查询的表名
:param args: 可变参数——查询的属性列
:return: 数据库查询结果
"""
# 根据表名以及属性列值进行数据库查询SQL语句生成
query = f'''SELECT {','.join('`' + field + '`' for field in args)}
FROM {'`' + tablename + '`'};'''
return self.execute_query(query)
使用示例
querydb = QueryDB()
querydb.get_specified_records('tablename','field1','field2'...)