利用Python如何批量修改数据库执行Sql文件


Posted in Python onJuly 29, 2018

前言

由于上篇文章中批量修改了文件,有的时候数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件,然后依次去其他数据库里导入,效率不说极低,也算低了,且都是些重复性的劳动,所以打算用Python来批量执行sql

环境

  • 版本:Python3.6
  • 系统:MacOS
  • IDE:PyCharm
  • 第三方库:pymysql

Show Code

import pymysql

host = 'xxx.65.9.191'
username = 'root'
password = 'root'

def connectMySQL():
 print('开始连接数据库')
 # 打开数据库连接
 db = pymysql.connect(host,username,password,charset='utf8')

 # 使用 cursor() 方法创建一个游标对象 cursor
 cursor = db.cursor()

 # 使用 execute() 显示所有数据库
 cursor.execute("SHOW DATABASES")
 print('开始查询所有数据库')

 # 获取所有数据库名称
 data = cursor.fetchall()

 # 开始操作
 for dbb in data:
  dbname = dbb[0]
  print('选中' + dbname + '数据库')
  # 选择数据库
  cursor.execute("use " + dbname)
  # 查看有哪些表
  cursor.execute("show tables")
  table = cursor.fetchall()
  # 如果不是3个表的就不管
  if len(table) != 3:
   continue
  for tb in table:
   tbname = tb[0]
   print('开始删除'+tbname+'表')
   # 删除所有的表
   cursor.execute("DROP TABLE " + tbname)
  executeScriptsFromFile('1.sql', cursor)
 db.close()


def executeScriptsFromFile(filename,cursor):
 fd = open(filename, 'r',encoding='utf-8')
 sqlFile = fd.read()
 fd.close()
 sqlCommands = sqlFile.split(';')

 for command in sqlCommands:
  try:
   cursor.execute(command)
  except Exception as msg:
   print(msg)

 print('sql执行完成')


if __name__ == "__main__":
 connectMySQL()

解释代码

这是用于执行sql文件,这里第一句就有个坑,最好设置encoding='utf-8'否则可能会报错UnicodeEncodeError: 'latin-1' codec can't encode characters in position 41-44: ordinal not in range(256),当读取了sql文件后用;分割语句然后用for循环依次执行sql语句

def executeScriptsFromFile(filename,cursor):
 fd = open(filename, 'r',encoding='utf-8')
 sqlFile = fd.read()
 fd.close()
 sqlCommands = sqlFile.split(';')

 for command in sqlCommands:
  try:
   cursor.execute(command)
  except Exception as msg:
   print(msg)
 print('sql执行完成')

这一段比较容易理解了,首先是连接数据库,注意还是最好设置一下charset='utf8' ,因为我要操作多个数据库执行sql文件,所以先把数据库名称全部获取出来,这里获取出来的结果是元组类型,即使for循环后出来的也是一个元组,所以用[0]取出元组中的值,然后选中数据库执行删表操作(当然不是每个人都要按我这些操作哈,需要执行啥操作就自己改SQL语句),表删完了,然后开始执行1.sql文件,执行完成后关闭数据库

def connectMySQL():
 print('开始连接数据库')
 # 打开数据库连接
 db = pymysql.connect(host,username,password,charset='utf8')

 # 使用 cursor() 方法创建一个游标对象 cursor
 cursor = db.cursor()

 # 使用 execute() 显示所有数据库
 cursor.execute("SHOW DATABASES")
 print('开始查询所有数据库')

 # 获取所有数据库名称
 data = cursor.fetchall()

 # 开始操作
 for dbb in data:
  dbname = dbb[0]
  print('选中' + dbname + '数据库')
  # 选择数据库
  cursor.execute("use " + dbname)
  # 查看有哪些表
  cursor.execute("show tables")
  table = cursor.fetchall()
  # 如果不是3个表的就不管
  if len(table) != 3:
   continue
  for tb in table:
   tbname = tb[0]
   print('开始删除'+tbname+'表')
   # 删除所有的表
   cursor.execute("DROP TABLE " + tbname)
  executeScriptsFromFile('1.sql', cursor)
 db.close()

这2篇文章的代码从思路、编写、到测试,用了一下午吧!我对Python也不是很熟悉,所以中间也踩了些坑,但确实能看出来,Python作为胶水语言拿来做这些小工具真的舒服!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python3非对称加密算法RSA实例详解
Dec 06 Python
Python3删除排序数组中重复项的方法分析
Jan 31 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
Jul 23 Python
python实现批量修改服务器密码的方法
Aug 13 Python
Python编写带选项的命令行程序方法
Aug 13 Python
如何解决django-celery启动后迅速关闭
Oct 16 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
如何基于Python爬虫爬取美团酒店信息
Nov 03 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
聊一聊python常用的编程模块
May 14 Python
利用Python如何批量更新服务器文件
Jul 29 #Python
python高阶爬虫实战分析
Jul 29 #Python
python3.5基于TCP实现文件传输
Mar 20 #Python
python3基于TCP实现CS架构文件传输
Jul 28 #Python
python cs架构实现简单文件传输
Mar 20 #Python
Tornado Web Server框架编写简易Python服务器
Jul 28 #Python
python使用tornado实现登录和登出
Jul 28 #Python
You might like
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
php json_encode值中大括号与花括号区别
2013/09/30 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
详解vue路由
2020/08/05 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Linux下编译安装MySQL-Python教程
2015/02/02 Python
Python实现查找系统盘中需要找的字符
2015/07/14 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
使用python+whoosh实现全文检索
2019/12/09 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
大学生应聘自荐信
2013/10/11 职场文书
学校出纳员岗位职责
2014/03/18 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
自荐信格式模板
2015/03/27 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
Python中requests库的用法详解
2022/06/05 Python