利用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 相关文章推荐
python删除列表内容
Aug 04 Python
Python 文件管理实例详解
Nov 10 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
python与php实现分割文件代码
Mar 06 Python
Python获取指定字符前面的所有字符方法
May 02 Python
Python第三方库h5py_读取mat文件并显示值的方法
Feb 08 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
Python实现生成密码字典的方法示例
Sep 02 Python
python 解决cv2绘制中文乱码问题
Dec 23 Python
python异常处理和日志处理方式
Dec 24 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
Dec 04 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
php include和require的区别深入解析
2013/06/17 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
js自带函数备忘 数组
2006/12/29 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
js 调用父窗口的具体实现代码
2013/07/15 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
JavaScript DOM基础
2015/04/13 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
Python模块学习 datetime介绍
2012/08/27 Python
Python库urllib与urllib2主要区别分析
2014/07/13 Python
python定时执行指定函数的方法
2015/05/27 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
外贸主管求职简历的自我评价
2013/10/23 职场文书
大专会计自我鉴定
2014/02/06 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
大学感恩节活动总结
2015/05/05 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
最美乡村教师观后感
2015/06/11 职场文书
中学校园广播稿
2015/08/18 职场文书
学生会主席任命书
2015/09/21 职场文书
Python 正则模块详情
2021/11/02 Python
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python