利用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 相关文章推荐
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
Jul 01 Python
TensorFlow在MAC环境下的安装及环境搭建
Nov 14 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 Python
pandas的唯一值、值计数以及成员资格的示例
Jul 25 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
windows支持哪个版本的python
Jul 03 Python
教你使用一行Python代码玩遍童年的小游戏
Aug 23 Python
Python中如何处理常见报错
Jan 18 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获取某个目录大小的代码
2008/09/10 PHP
PHP得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
浅谈PHP的反射API
2017/02/26 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
详解Python中的type()方法的使用
2015/05/21 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
python批量处理txt文件的实例代码
2020/01/13 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
入党积极分子介绍信
2014/01/17 职场文书
春节联欢会主持词
2014/03/24 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
党支部考察意见范文
2015/06/02 职场文书
《植树问题》教学反思
2016/03/03 职场文书