利用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 相关文章推荐
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
python中从str中提取元素到list以及将list转换为str的方法
Jun 26 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
Python数据类型之Dict字典实例详解
May 07 Python
Python中base64与xml取值结合问题
Dec 22 Python
使用tensorflow显示pb模型的所有网络结点方式
Jan 23 Python
如何更换python默认编辑器的背景色
Aug 10 Python
python邮件中附加文字、html、图片、附件实现方法
Jan 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
PHP获取MAC地址的函数代码
2011/09/11 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
JavaScript中常见陷阱小结
2010/04/27 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
Javascript如何实现扩充基本类型
2020/08/26 Javascript
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
简介Django中内置的一些中间件
2015/07/24 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
某公司.Net方向面试题
2014/04/24 面试题
综合测评自我鉴定
2013/10/08 职场文书
往来会计岗位职责
2013/12/19 职场文书
老公给老婆的保证书
2014/04/28 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
学校会议通知范文
2015/04/15 职场文书
2016党校学习心得体会
2016/01/07 职场文书
Redis如何实现分布式锁
2021/08/23 Redis