热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python工具类_四十七、Python封装操作MySQL工具类精华版

Python操作MySQL工具类在上一篇文章中,简单对Python利用pymysql操作MySQL进行了封装,实现了多种功能的复用。接下来,
8630184f70583e507bf3b4dc136a2cc6.png

Python操作MySQL工具类

在上一篇文章中,简单对Python利用pymysql操作MySQL进行了封装,实现了多种功能的复用。接下来,在参阅pymysql的API后,对Python进行了更加详细的封装,实现了Python操作MySQL的工具类MySQLDBHelper,其代码主要如下:

MySQLDBHelper工具类

import pymysqlimport reclass MySQLDBHelper(object): """ 定义构造方法,用于初始化数据库连接 """ def __init__(self, config): self.host = config['host'] self.user = config['user'] self.password = config['password'] self.port = config['port'] self.connection = None self.cursor = None try: self.connection = pymysql.connect(**config) self.connection.autocommit(1) # 调用cursor()方法创建一个用于操作的游标 self.cursor = self.connection.cursor() except: print("数据库连接失败,请检查数据库配置项!") # 定义关闭数据库连接的方法 def close(self): if not self.connection: self.connection.close() else: print("数据库连接已经关闭!") # 创建数据库 def createDatabase(self, DB_NAME): """ 创建数据库 """ self.cursor.execute( "CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" % DB_NAME) self.connection.select_db(DB_NAME) print(f"数据库{DB_NAME}创建成功!") # 选择数据库 def selectDatabase(self, DB_NAME): self.connection.select_db(DB_NAME) # 获取数据库的版本号 def getDatabaseVersion(self): self.cursor.execute('SELECT VERSION()') return self.queryOne() # 获取一行查询结果 def queryOne(self): return self.cursor.fetchone() # 创建数据库表 def createTable(self, table_name, attribute_dict, constraint): """ 创建数据库表 :param table_name: 表的名称 :param attribute_dict: 属性键值对 :param constraint: 主外键约束 """ # 判断要创建的表是否存在 if self.isExistTable(table_name): print(f"{table_name}已经存在!") return sql = '' sql_mid = '`id` bigint(11) auto_increment,' for attr, value in attribute_dict.items(): sql_mid = sql_mid + '`' + attr + '`' + ' ' + value + ',' sql = sql + 'CREATE TABLE IF NOT EXISTS %s (' % table_name sql = sql + sql_mid sql = sql + constraint sql = sql + ') ENGINE=InnoDB DEFAULT CHARSET=utf8' print(f'创建表的语句是:{sql}') self.executeCommit(sql) def executeSql(self, sql=''): """ 执行sql语句,针对读操作返回结果集 """ try: self.cursor.execute(sql) records = self.cursor.fetchall() return records except pymysql.Error as e: print(f'SQL语句执行失败!ERROR({e.args[0]}): {e.args[1]}') def executeCommit(self, sql=''): """ 执行SQL语句,针对更新、删除等事务操作,失败时回滚 """ try: self.cursor.execute(sql) self.connection.commit() except pymysql.Error as e: self.connection.rollback() error = 'SQL语句执行失败!ERROR (%s): %s' % (e.args[0], e.args[1]) print(error) return error def insert(self, table_name, params): """ """ key = [] value = [] for k, v in params.items(): key.append(k) if isinstance(v, str): value.append("'" + v + "'") else: value.append(v) attrs_sql = '(' + ','.join(key) + ')' values_sql = ' values(' + ','.join(value) + ')' sql = 'insert into %s' % table_name sql = sql + attrs_sql + values_sql print(f'插入SQL语句: {sql}') self.executeCommit(sql) def select(self, table_name, cond_dict='', order='', fields='*'): """ 查询数据 args: table_name: 表的名字 cond_dict: 查询条件 order: 排序条件 示例: db.select(table) db.select(table, fields=['user_name]) db.select(table, fields=['user_name','income']) """ cond_sql = ' ' if cond_dict != '': for k, v in cond_dict.items(): cond_sql = cond_sql + '`' + k + '`' + '=' + '"' + v + '"' + ' and' cond_sql = cond_sql + ' 1=1 ' if fields == '*': sql = 'select * from %s where ' % table_name else: if isinstance(fields, list): fields = ",".join(fields) sql = 'select %s from %s where ' % (fields, table_name) else: print('传入的字段不正确,请以列表的形式传入字段信息!') sql = sql + cond_sql + order print(f'查询语句: {sql}') return self.executeSql(sql) def insertMany(self, table_name, attrs, values): """ 插入多条数据 args: table_name: 表的名字 attrs: 属性键 values: 属性值 示例: table_name ='mytable' key = ["id","name","age"] value = [[1,'张三',20],[2,'李四',25]] db.insertMany(table_name, key, value) """ values_sql = ['%s' for attr in attrs] attrs_sql = '(' + ','.join(attrs) + ')' values_sql = ' values(' + ','.join(values_sql) + ')' sql = 'insert into %s' % table_name sql = sql + attrs_sql + values_sql print(f'插入多条语句:{sql}') try: for i in range(0, len(values), 20000): self.cursor.executemany(sql, values[i:i + 20000]) self.connection.commit() except pymysql.Error as e: self.connection.rollback() print(f'插入多条数据遇到错误! ERROR({e.args[0]}):{e.args[1]}') def delete(self, table_name, cond_dict): """ 删除数据 args: table_name: 表的名字 cond_dict: 删除条件字典 示例: params = {'name': '风清扬', 'age':38} db.delete(table_name, params) """ cond_sql = ' ' if cond_sql != '': for k, v in cond_dict.items(): if isinstance(v, str): v = "'" + v + "'" cond_sql = cond_sql + table_name + "." + k + '=' + v + ' and ' cond_sql = cond_sql + ' 1=1 ' sql = 'delete from %s where %s ' % (table_name, cond_sql) print(f'生成的sql语句:{sql}') return self.executeCommit(sql) def update(self, table_name, attrs_dict, cond_dict): """ args: table_name: 表的名字 attrs_dict: 更新属性键值对字典 cond_dict: 更新条件字典 example: params = {'name': '风清扬', 'age': 40} """ attrs_list = [] cond_sql = ' ' for k, v in attrs_dict.items(): attrs_list.append("`" + k + "`" + "=" + "'" + v + "'") attrs_sql = ",".join(attrs_list) print(f"attrs_sql: {attrs_sql}") if cond_dict != '': for k, v in cond_dict.items(): if isinstance(v, str): v = "'" + v + "'" cond_sql = cond_sql + "`" + table_name + "`." + "`" + k + "`" + '=' + v + ' and ' cond_sql = cond_sql + ' 1=1 ' sql = 'update %s set %s where %s' % (table_name, attrs_sql, cond_sql) print(sql) return self.executeCommit(sql) def dropTable(self, table_name): """ 删除数据库表 args: table_name: 表名字 """ sql = 'DROP TABLE %s' % table_name self.executeCommit(sql) def deleteTable(self, table_name): """ 清空表数据 """ sql = 'DELETE FROM %s' % table_name print(sql) self.executeCommit(sql) def truncateTable(self, table_name): """ 清空表数据,不写日志 """ sql = 'TRUNCATE TABLE %s' % table_name print(sql) self.executeCommit(sql) def isExistTable(self, table_name): """ 判断表是否存在 """ sql = 'select * from %s' % table_name ret = self.executeCommit(sql) if ret is None: return True else: if re.search("doesn't exist", ret): return False else: return True

MySQLDBHelper工具类的测试

# 测试if __name__ == "__main__": # 定义数据库访问参数 config = { 'host': 'node05', 'user': 'root', 'password': 'Love88me', 'port': 3306, 'charset': 'utf8', 'cursorclass': pymysql.cursors.DictCursor } # 初始化打开数据库连接 db = MySQLDBHelper(config) # 打印数据库版本 print(db.getDatabaseVersion()) # 测试创建数据库 print("================测试创建数据库=========================") DB_NAME = input('输入要创建的数据库名称:') db.createDatabase(DB_NAME) # 测试选择数据库 print("================测试选择数据库=========================") db.selectDatabase(DB_NAME) # 测试创建表 print("================测试创建数据表=========================") table_name = input('请输入要创建的数据表名:') ''' 例如 create table `location` ( `id` bigint(11) not null auto_increment, `name` varchar(30) not null, `province` varchar(20), `city` varchar(50) ) engine=InnoDB default charset=utf8; ''' attrs_dict = { 'name': 'varchar(30) not null', 'province': 'varchar(30) not null', 'city': 'varchar(50)' } constraint = 'primary key(`id`)' db.createTable(table_name, attrs_dict, constraint) # 测试单条数据插入功能 params = {'name': '北京市文化局', 'province': '北京', 'city': '丰台区'} db.insert(table_name, params) # 测试批量插入数据 insert_values = [['江苏省无锡市文化局','江苏省','无锡市'], ['安徽省合肥市教育局','安徽省','合肥市'], ['浙江省杭州市旅游局','浙江省','杭州市']] insert_attrs = ['name','province','city'] db.insertMany(table_name, insert_attrs, insert_values) # 测试数据查询 print(db.select(table_name, fields=['id','name'])) print(db.select(table_name,cond_dict={'province':'江苏省'}, fields=['name','province','city'])) print(db.select(table_name, fields=['id','name', 'province', 'city'], order='order by id desc')) # 测试更新数据 update_params = {'name':'江苏省无锡市苏南国际鸡厂'} update_cond_dict = {'province':'江苏省'} db.update(table_name, update_params, update_cond_dict) # 测试删除数据 delete_params = {'province':'安徽省'} db.delete(table_name, delete_params) # 测试删除表数据 db.deleteTable(table_name) # 测试删除表 db.dropTable(table_name)

803ed361c6242db816e950866664d080.png

操作的中间结果




推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
author-avatar
w3cbj.cn
w3c笔记,程序员专属笔记云平台,24种代码高亮!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有