用 Python 将多表分批次从数据库导出到Excel

论坛 期权论坛 期权     
Python中文社区   2019-7-14 05:30   3394   0

文/张俊 投稿  图片来源于网络
[h3]本文目录[/h3]1. 应用场景2. 功能事项3. 主要实现概览主要方法4. 使用示例5. 总结
[h3]1. 应用场景[/h3]最近经常需要手工从后台数据库导出某些数据表到Excel文件,而且源数据表的数据量大小不一,导致在导出到本地文件这个过程中需要根据情况来调整每个批次的写入数据量。为了避免反复的手工操作、高效率到多份离线数据,便做了这个小工具来一键完成任务。
[h3]2. 功能事项[/h3]
  • 支持一次性导出多个数据源表、自动获取各表的字段名。
  • 支持控制批次的写入速率。例如:每5000行一个批次写入到excel。
  • 支持结构相同的表导入到同一个Excel文件。可适用于经过水平切分后的分布式表。
[h3]3. 主要实现[/h3]概览
  1. A[创建类] -->|方法1| B(创建数据库连接)
  2. A[创建类] -->|方法2| C(取查询结果集)
  3. A[创建类] -->|方法3| D(利用句柄写入Excel)
  4. A[创建类] -->|方法4| E(读取多个源表)
  5. B(创建数据库连接) -->U(调用示例)
  6. C(取查询结果集) -->U(调用示例)
  7. D(利用句柄写入Excel) -->U(调用示例)
  8. E(读取多个源表) -->U(调用示例)
复制代码
主要方法
  • 首先需要安装第三方库pymssql实现对SQLServer的连接访问,自定义方法__getConn()需要指定如下五个参数:服务器host、登录用户名user、登录密码pwd、指定的数据库db、字符编码charset。连接成功后,通过cursor()获取游标对象,它将用来执行数据库脚本,并得到返回结果集和数据总量。
  • 附上创建数据库连接和执行SQL的源码:
  1.     def __init__(self,host,user,pwd,db):
  2.         self.host = host
  3.         self.user = user
  4.         self.pwd = pwd
  5.         self.db = db
  6.     def __getConn(self):
  7.         if not self.db:
  8.             raise(NameError,'没有设置数据库信息')
  9.         self.conn = pymssql.connect(host=self.host, user=self.user, password=self.pwd, database=self.db, charset='utf8')
  10.         cur = self.conn.cursor()
  11.         if not cur:
  12.             raise(NameError,'连接数据库失败')
  13.         else:
  14.             return cur
复制代码
  • 方法3中写入Excel时,注意一定要用到Pandas中的公共句柄ExcelWriter对象writer。当数据被分批多次写入同一个文件时,如果直接使用to_excel()方法,则前面批次的结果集将会被后续结果覆盖。增加了这个公共句柄限制后,后面的写入会累加到前面写入的数据尾部行,而不是全部覆盖。
  1. writer = pd.ExcelWriter(file)
  2. df_fetch_data[rs_startrow:i*N].to_excel(writer, header=isHeader, index=False, startrow=startRow)
复制代码
  • 分批次写入到目标Excel时的另一个要注意的参数是写入行startrow的设置。每次写入完成后需要重新指下一批次数据的初始位置值。每个批次的数据会记录各自的所属批次信息。
  • 利用关键字参数
    1. **args
    复制代码
    指定多个数据源表和数据库连接。
  1. def exportToExcel(self, **args):
  2.     for sourceTB in args['sourceTB']:
  3.         arc_dict = dict(
  4.             sourceTB = sourceTB,
  5.             path=args['path'],
  6.             startRow=args['startRow'],
  7.             isHeader=args['isHeader'],
  8.             batch=args['batch']
  9.         )
  10.         print('\n当前导出的数据表为:%s' %(sourceTB))
  11.         self.writeToExcel(**arc_dict)
  12.     return 'success'
复制代码
[h3]4. 使用示例[/h3]如下是调用样例。先用类MSSQL创建对象,再定义关键字参数args,最终调用方法导出到文件即完成数据导出。
  1. import pandas as pd
  2. ms = MSSQL(host="localhost",user="test",pwd="test",db="db_jun")
  3. args = dict(
  4. sourceTB = ['tb2', 'tb1'],# 待导出的表
  5. path='D:\\myPC\\Python\\',# 导出到指定路径
  6. startRow=1,#设定写入文件的首行,第2行为数据首行
  7. isHeader=False,# 是否包含源数据的标题
  8. batch=5
  9. )
  10. # 导出到文件
  11. ms.exportToExcel(**args)
复制代码
[h3]5. 总结[/h3]本篇主要介绍完成多表(相同表结构)导出数据、分批次写入到同一Excel的实现过程,需要注意使用文件公共句柄、写入行初始化、关键字参数配置等。后续也可以继续扩展,将指定数据源表导出到指定目标文件。
长按扫描关注下方公众号后回复“excel”,获取本文全部源码

▼ 点击成为社区注册会员          「在看」一下,一起PY!
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:200
帖子:40
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP