利用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妹子图简单爬虫实例
Jul 07 Python
jupyter安装小结
Mar 13 Python
python 循环while和for in简单实例
Aug 16 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
Dec 19 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
详解Django中间件的5种自定义方法
Jul 26 Python
python实现多张图片拼接成大图
Jan 15 Python
浅析PyTorch中nn.Module的使用
Aug 18 Python
python线程的几种创建方式详解
Aug 29 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
基于TensorFlow的CNN实现Mnist手写数字识别
Jun 17 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中遍历二维数组的几种方法详解
2013/06/08 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
PHP的拦截器实例分析
2014/11/03 PHP
php实现paypal 授权登录
2015/05/28 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
javascript div 弹出可拖动窗口
2009/02/26 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
ant design实现圈选功能
2019/12/17 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
Python使用django搭建web开发环境
2017/06/09 Python
python实现函数极小值
2019/07/10 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
Python实现序列化及csv文件读取
2020/01/19 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
秋季红领巾广播稿
2014/01/27 职场文书
中层干部竞聘演讲稿
2014/05/15 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年教研室工作总结
2014/12/06 职场文书
教师求职信怎么写
2015/03/20 职场文书
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL