利用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基于queue和threading实现多线程下载实例
Oct 08 Python
Python中实现三目运算的方法
Jun 21 Python
Python中集合的内建函数和内建方法学习教程
Aug 19 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
Python操作MySQL数据库的三种方法总结
Jan 30 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
python创建文件备份的脚本
Sep 11 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
学python最电脑配置有要求么
Jul 05 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
PHP也能干大事之PHP中的编码解码详解
2015/04/20 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
基于jQuery的日期选择控件
2009/10/27 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
使用js获取地址栏中传递的值
2013/07/02 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
windows下安装python paramiko模块的代码
2013/02/10 Python
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
Python三级菜单的实例
2017/09/13 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
详解python变量与数据类型
2020/08/25 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
党校学习思想汇报
2014/01/06 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
售后服务承诺书范文
2014/03/26 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
鼋头渚导游词
2015/02/05 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
党支部评议意见
2015/06/02 职场文书
酒店宣传语大全
2015/07/13 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书