利用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 列表(List)操作方法详解
Mar 11 Python
用Python进行TCP网络编程的教程
Apr 29 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
Python分支结构(switch)操作简介
Jan 17 Python
Python装饰器简单用法实例小结
Dec 03 Python
Python使用统计函数绘制简单图形实例代码
May 15 Python
python中pygame安装过程(超级详细)
Aug 04 Python
使用Python的Turtle库绘制森林的实例
Dec 18 Python
Python接口测试数据库封装实现原理
May 09 Python
详解python中GPU版本的opencv常用方法介绍
Jul 24 Python
python运算符之与用户交互
Apr 13 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文件读写操作之文件读取方法详解
2011/01/13 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
str_replace只替换一次字符串的方法
2013/04/09 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
node.js操作mysql简单实例
2017/05/25 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
Python中的字典与成员运算符初步探究
2015/10/13 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
Pycharm更换python解释器的方法
2018/10/29 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
如何使用Python调整图像大小
2020/09/26 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
Delphi软件工程师试题
2013/01/29 面试题
制作部班长职位说明书
2014/02/26 职场文书
工作岗位说明书模板
2014/05/09 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang