利用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插入数据到列表的方法
Apr 30 Python
使用Python脚本来获取Cisco设备信息的示例
May 04 Python
Python中的深拷贝和浅拷贝详解
Jun 03 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
Python对HTML转义字符进行反转义的实现方法
Apr 28 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
Python3批量创建Crowd用户并分配组
May 20 Python
virtualenv介绍及简明教程
Jun 23 Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 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 静态化实现代码
2009/03/20 PHP
php简单提示框alert封装函数
2010/08/08 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
JavaScript中清空数组的三种方式
2017/03/22 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
python新手经常遇到的17个错误分析
2014/07/30 Python
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
个人找工作的自我评价
2013/10/17 职场文书
高校学生干部的自我评价分享
2013/11/04 职场文书
质检部岗位职责
2013/11/11 职场文书
2014年冬季防火方案
2014/05/21 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
2015年信访工作总结
2015/04/07 职场文书
花木兰观后感
2015/06/10 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python
Win11应用商店打开闪退怎么解决? win11应用商店打不开的多种解决办法
2022/04/05 数码科技
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript