Pythonを使用して、複数の表のロットをデータベースからExcelにエクスポートすることを実現します。


一、応用シーン
バックグラウンドデータベースからいくつかのデータテーブルからエクセルファイルへのハンドメイドの繰り返しを避けるために、複数のオフラインデータまで効率的にエクスポートします。
二、機能事項
複数のデータソーステーブルを一括でエクスポートし、各テーブルのフィールド名を自動的に取得することができます。
制御ロットの書き込み速度に対応します。例えば、5000行に1ロットずつエクセルに書き込みます。
同じ構造のテーブルを同じExcelファイルにインポートします。水平分割された分布式の表に適用できます。
三、主要実現
1、概要
A[クラスを作成]->|方法1|B(データベース接続を作成)
A[作成クラス]->|方法2|C(クエリ結果セットを取る)
A[作成クラス]->>|方法3|D(ハンドルでExcelに書き込む)
A[クラスを作成]->|方法4|E(複数のソーステーブルを読み出す)
B(データベース接続の作成)->U(呼び出し例)
C(クエリー結果セット)->U(呼び出し例)
D(ハンドルでExcelに書き込む)->U(呼び出し例)
E(複数のソーステーブルを読み込む)->U(呼び出し例)
2、主な方法
まず第三者ライブラリpymssqlをインストールしてSQLServerへの接続アクセスを実現し、カスタムメソッドを行う必要があります。getConn()は、サーバhost、ログインユーザ名user、ログインパスワードpwd、指定されたデータベースdb、文字コードcharsetの5つのパラメータを指定する必要があります。接続が成功したら、クルーズオブジェクトをcursor()で取得し、データベーススクリプトを実行し、結果セットとデータ総量を返します。
データベース接続を作成して実行するSQLのソースコード:

def __init__(self,host,user,pwd,db):
    self.host = host
    self.user = user
    self.pwd = pwd
    self.db = db

  def __getConn(self):
    if not self.db:
      raise(NameError,'         ')
    self.conn = pymssql.connect(host=self.host, user=self.user, password=self.pwd, database=self.db, charset='utf8')
    cur = self.conn.cursor()
    if not cur:
      raise(NameError,'       ')
    else:
      return cur
3、方法3でExcelに書き込む時は、必ずPandsの中の公共の文脈エクセルWriterオブジェクトwriterを使うように注意してください。データがバッチされて何度も同じファイルに書き込まれた場合、直接にto_を使用します。excel()の方法では、前のロットの結果集が後の結果によってカバーされます。この公共の構文の制限を追加したら、後の書き込みは全部ではなく、前に書き込んだデータの末尾行に加算されます。
writer=pd.Excel Writer(file)
df_fetchdata[rs_]startrow:i*N.to_excel(writer、header=isHeader、index=False、startrow=startRow)
バッチでターゲットExcelに書き込む時のもう一つの注意すべきパラメータは書き込みstartrowの設定です。書き込みが完了するたびに、次のロットのデータの初期位置値を見直す必要があります。各ロットのデータはそれぞれの所属ロット情報を記録します。
キーワードパラメータ**argsで複数のデータソーステーブルとデータベース接続を指定します。

def exportToExcel(self, **args):
  for sourceTB in args['sourceTB']:    
    arc_dict = dict(
      sourceTB = sourceTB,
      path=args['path'],
      startRow=args['startRow'],
      isHeader=args['isHeader'],
      batch=args['batch']
    )
    print('
:%s' %(sourceTB)) self.writeToExcel(**arc_dict) return 'success'
四、まずクラスMSSQLでオブジェクトを作成し、キーワードパラメータargsを定義し、最終的に呼び出し方法をファイルにエクスポートするとデータのエクスポートが完了します。

#!/usr/bin/env python
# coding: utf-8

#     :         、         excel 
#               , 
#     :to_excel          ,               ,
#   Pandas   ExcelWriter()          ,                  ,                    
import pymssql 
import pandas as pd 
import datetime 
import math
 
class MSSQL(object):
  def __init__(self,host,user,pwd,db):
    self.host = host
    self.user = user
    self.pwd = pwd
    self.db = db
 
  def __getConn(self):
    if not self.db:
      raise(NameError,'         ')
    self.conn = pymssql.connect(host=self.host, user=self.user, password=self.pwd, database=self.db, charset='utf8')
    cur = self.conn.cursor()
    if not cur:
      raise(NameError,'       ')
    else:
      return cur
   
  def executeQuery(self,sql):
    cur = self.__getConn()
    cur.execute(sql)
    #        
    # fetchall()             
    #        ,         
    resList, rowcount = cur.fetchall(),cur.rowcount
    self.conn.close()
    return (resList, rowcount)
 
  #         excel 
  def writeToExcel(self,**args):
    sourceTB = args['sourceTB']
    columns = args.get('columns')
    path=args['path']
    fname=args.get('fname')
    startRow=args['startRow']
    isHeader=args['isHeader']
    N=args['batch']
     
    #         
    if columns is None:
      columns_select = ' * '
    else:
      columns_select = ','.join(columns)
     
    if fname is None:
      fname=sourceTB+'_exportData.xlsx'
     
    file = path + fname
    #         ,      ,      
    writer = pd.ExcelWriter(file)
     
    sql_select = 'select '+ columns_select + ' from '+ sourceTB
    fetch_data, rowcount = self.executeQuery(sql_select)
    # print(rowcount)
     
    df_fetch_data = pd.DataFrame(fetch_data)
    #    roucount   , N   batch     excel 
    times = math.floor(rowcount/N)
    i = 1
    rs_startrow = 0
    #       >           
    print(i, times)
    is_while=0
    while i <= times:
      is_while = 1
      #      ,       ,    
      if i==1:
        # isHeader = True
        startRow = 1
      else:
        # isHeader = False
        startRow+=N
      #                ,     
      # startrow:            。0   1 ,1   2 。。。
      df_fetch_data['batch'] = 'batch'+str(i)
      df_fetch_data[rs_startrow:i*N].to_excel(writer, header=isHeader, index=False, startrow=startRow)
      print(' ',str(i),'   ,     ',rs_startrow,'  ',i*N,' ','    ',startRow,' ')
      print(' ',str(i),'      :',df_fetch_data[rs_startrow:i*N])
      #              
      rs_startrow =i * N
      i+=1
 
    #          
    #          ,          
    if is_while == 0:
      startRow = startRow
    else:
      startRow+=N
    df_fetch_data['batch'] = 'batch'+str(i)
    print(' {0}     ,  {1}   ,    {2} !'.format(str(i), str(rs_startrow), str(startRow)))
    print(' ',str(i),'     :',df_fetch_data[rs_startrow:i*N])
    df_fetch_data[rs_startrow:i*N].to_excel(writer, header=isHeader, index=False, startrow=startRow)
     
    #  :      saver()          !!!!!!!!!!!!!!!!!!!!!1
    writer.save()
     
    start_time=datetime.datetime.now()
  #               excel
  def exportToExcel(self, **args):
    for sourceTB in args['sourceTB']:    
      arc_dict = dict(
        sourceTB = sourceTB,
        path=args['path'],
        startRow=args['startRow'],
        isHeader=args['isHeader'],
        batch=args['batch']
      )
      print('
:%s' %(sourceTB)) self.writeToExcel(**arc_dict) return 'success' start_time=datetime.datetime.now() if __name__ == "__main__": ms = MSSQL(host="localhost",user="test",pwd="test",db="db_jun") args = dict( sourceTB = ['tb2', 'tb1'],# path='D:\\myPC\\Python\\',# startRow=1,# , 2 isHeader=False,# batch=5 ) # ms.exportToExcel(**args)
以上のPythonを使って、多表バッチをデータベースからExcelにエクスポートすると、小編纂をみんなに共有する内容になります。参考にしてもらいたいです。よろしくお願いします。