利用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实现ip查询示例
Mar 26 Python
Python使用PyCrypto实现AES加密功能示例
May 22 Python
Python MD5加密实例详解
Aug 02 Python
Django在win10下的安装并创建工程
Nov 20 Python
python中的随机函数小结
Jan 27 Python
python如何通过实例方法名字调用方法
Mar 21 Python
Python中判断输入是否为数字的实现代码
May 26 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
Feb 07 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
让Django的BooleanField支持字符串形式的输入方式
May 20 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
德劲1107的电路分析与打磨
2021/03/02 无线电
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
python读写ini文件示例(python读写文件)
2014/03/25 Python
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
详解Python网络爬虫功能的基本写法
2016/01/28 Python
python编写分类决策树的代码
2017/12/21 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
用python简单实现mysql数据同步到ElasticSearch的教程
2018/05/30 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
python定时关机小脚本
2018/06/20 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
将python安装信息加入注册表的示例
2019/11/20 Python
python opencv进行图像拼接
2020/03/27 Python
基于Python测试程序是否有错误
2020/05/16 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
岗位职责范本
2013/11/23 职场文书
2014年营销工作总结
2014/11/22 职场文书