160 lines
4.7 KiB
Python
160 lines
4.7 KiB
Python
import pymysql
|
|
from sqlalchemy import create_engine
|
|
import pandas as pd
|
|
import openpyxl
|
|
import subprocess
|
|
import random
|
|
from datetime import datetime
|
|
import os, logging, sys, time
|
|
|
|
class autoDBreq:
|
|
def __init__(self, dbuser, dbpass, dbname, sql, order_doc_no):
|
|
self.startTime = datetime.now()
|
|
self.dbhost = '127.0.0.1'
|
|
self.dbport = 3306
|
|
self.dbuser = dbuser
|
|
self.dbpass = dbpass
|
|
self.dbname = dbname
|
|
self.charset = 'utf-8'
|
|
self.sql = sql
|
|
self.df = self.dbfetch()
|
|
self.filepath = './'
|
|
self.filename = self.makefilename()
|
|
self.protectedFilename = self.protectedFilename()
|
|
self.affectedRow = self.affectedRow()
|
|
self.order_doc_no = order_doc_no
|
|
self.password = self.makepass()
|
|
self.vbaBinLoc = './'
|
|
self.checkProtection = self.checkProtection()
|
|
|
|
def __del__(self):
|
|
print(self.makelogdata('anything_sample','anything_sample.name,anything_sample.birth'))
|
|
if self.checkProtection == "True":
|
|
cmd = 'rm -rf ' + self.filepath + self.filename
|
|
delsrc = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
|
|
delsrc.wait()
|
|
|
|
def timelog(self):
|
|
consumtime = datetime.now() - self.startTime
|
|
return consumtime
|
|
|
|
def checkProtection(self):
|
|
if self.order_doc_no != '':
|
|
res = 'True'
|
|
else:
|
|
res = 'False'
|
|
return res
|
|
|
|
def dbfetch(self):
|
|
try:
|
|
con_str_fmt = 'mysql+mysqldb://{0}:{1}@{2}:{3}/{4}?charset={5}'
|
|
con_str = con_str_fmt.format(self.dbuser, self.dbpass, self.dbhost, self.dbport, self.dbname, 'utf8')
|
|
pymysql.install_as_MySQLdb()
|
|
import MySQLdb
|
|
engine = create_engine(con_str, encoding=self.charset)
|
|
conn = engine.connect()
|
|
df = pd.read_sql(self.sql, con=conn)
|
|
conn.close()
|
|
except:
|
|
df = pd.DataFrame()
|
|
return df
|
|
|
|
def cookXls(self):
|
|
if self.affectedRow != 0:
|
|
writer = pd.ExcelWriter(self.filepath + self.filename, engine='xlsxwriter')
|
|
self.df.to_excel(writer, '쿼리결과', index=False)
|
|
if self.checkProtection == "True":
|
|
self.insertVba(writer)
|
|
self.encryptXls()
|
|
else:
|
|
writer.save()
|
|
else:
|
|
pass
|
|
|
|
def affectedRow(self):
|
|
row_count = 0
|
|
for col in self.df.index:
|
|
row_count += 1
|
|
return row_count
|
|
|
|
def makelogdata(self,tablename,columnname):
|
|
if self.checkProtection == 'True':
|
|
password = self.password
|
|
else:
|
|
password = ''
|
|
if self.affectedRow != 0:
|
|
if self.checkProtection == 'True':
|
|
excelfile = self.protectedFilename
|
|
else:
|
|
excelfile = self.filename
|
|
status = 'SUCCESS'
|
|
else:
|
|
excelfile = ''
|
|
status = 'SQL ERROR: No Result'
|
|
res = {
|
|
'dbname':self.dbname,
|
|
'tablename': tablename,
|
|
'fieldname': columnname,
|
|
'row_count': self.affectedRow,
|
|
'execute_time': self.timelog(),
|
|
'order_doc_no': self.order_doc_no,
|
|
'excelfile': excelfile,
|
|
'password': password,
|
|
'status': status
|
|
}
|
|
return res
|
|
|
|
def encryptXls(self):
|
|
try:
|
|
encrypted = self.protectedFilename + '.encrypted.xlsx'
|
|
cmd = 'secure-spreadsheet --password ' + str(self.password) + ' --input-format xlsx < ' + self.filepath + self.protectedFilename + ' > ' + self.filepath + encrypted
|
|
encrypt_execute = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
|
|
encrypt_execute.wait()
|
|
cmdmv = 'mv -f ' + self.filepath + encrypted + ' ' + self.filepath + self.protectedFilename
|
|
clean_xls = subprocess.Popen(cmdmv,stdout=subprocess.PIPE,shell=True)
|
|
clean_xls.wait()
|
|
res = 'Encryption Success'
|
|
except:
|
|
res = str(encrypt_execute)
|
|
|
|
def makepass(self):
|
|
num = random.randrange(1000,9999)
|
|
return num
|
|
|
|
def makefilename(self):
|
|
fn = str(random.randrange(10000,99999)) + '_' + str(self.startTime.strftime("%Y%m%d%H%M%S")) + '.xlsx'
|
|
return fn
|
|
|
|
def protectedFilename(self):
|
|
fn = self.filename.split('.')[-2] + '.xlsm'
|
|
return fn
|
|
|
|
def insertVba(self,writer):
|
|
vbaLoc = self.vbaBinLoc + 'vbaProject.bin'
|
|
workbook = writer.book
|
|
workbook.filename = self.filepath + self.protectedFilename
|
|
workbook.add_vba_project(vbaLoc)
|
|
writer.save()
|
|
|
|
|
|
###########################################################################################################
|
|
|
|
join_dt = sys.argv[1]
|
|
join_todt = sys.argv[2]
|
|
|
|
sql = 'SELECT name AS 이름, birth AS 생년월일, join_dt AS 가입일시 FROM anything_sample WHERE join_dt >= "' + join_dt + '" AND join_dt <= "' + join_todt + '"'
|
|
print(sql)
|
|
|
|
datafetch = autoDBreq('maddiekorea','mad(#lin','test', sql, 'JG_20220322_0003')
|
|
#datafetch = autoDBreq('maddiekorea','mad(#lin','test', sql, '')
|
|
datafetch.cookXls()
|
|
|
|
|
|
################################################################################################################
|
|
|
|
# https://github.com/ankane/secure-spreadsheet
|
|
# node.js 애플리케이션 설치 후 사용 (엑셀 패스워드 관련)
|
|
# pip3 install xlsxWriter # vba관련 .... vba_extract.py 추출 https://pbpython.com/advanced-excel-workbooks.html
|
|
|
|
|