利用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调用shell的方法
Nov 20 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
一篇文章快速了解Python的GIL
Jan 12 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
python图像和办公文档处理总结
May 28 Python
Django REST framework内置路由用法
Jul 26 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 Python
tensorflow中tf.reduce_mean函数的使用
Apr 19 Python
Python编程源码报错解决方法总结经验分享
Oct 05 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脚本的10个技巧(1)
2006/10/09 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
vue中mint-ui的使用方法
2018/04/04 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
解决PyCharm中光标变粗的问题
2017/08/05 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
客户经理岗位职责
2013/12/08 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
护士岗前培训自我评鉴
2014/02/28 职场文书
儿童生日会策划方案
2014/05/15 职场文书
规范化管理年活动总结
2014/08/29 职场文书
教师辞职书范文
2015/02/26 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
利用Python实时获取steam特惠游戏数据
2022/06/25 Python