运行环境:
redhat6 + python3.6 + crontab + Oracle客户端
用到的python模块:
模块 | 用到的功能 |
---|---|
cx_Oracle | 连接Oracle数据库 |
openpyxl | 导出excel |
zipfile | 压缩文件 |
smtplib | 发送邮件 |
添加邮件附件 |
操作步骤:
1. 安装python3.6 请参考redhat6安装python3.6.9
2. 安装python模块:用pip安装即可
3. 安装Oracle客户端:可以下载Oracle轻量级客户端,请参考oracle客户端下载
4. 配置环境变量 LD_LIBRARY_PATH=[oracle客户端安装目录]:$LD_LIBRARY_PATH ,NLS_LANG=[oracle数据库NLS_LANGUAGE_NLS_TERRITORY.NLS_CHARACTERSET] ,并添加到 ~/.bash_profile 中
5. 编写代码,代码分为两部分,第一个配置文件,如下:
##数据库相关参数:主机 、数据库用户、数据库密码、数据库sid、数据库字符集nls_lan
ora_host = '192.168.1.100'
ora_user = 'test'
ora_pwd = 'test'
ora_sid = 'test'
##nls_lan = 'AMERICAN_AMERICA.ZHS16GBK'
##数据库共享库目录
##lib_path = '/opt/oracle/instantclient_11_2'
##执行脚本(py,sql)目录
exe_path = '/root/python/prod/test/bin'
##数据库导出sql语句文件,多个文件用逗号隔开;如果sql文件在执行脚本目录下,可以使用相对路径,否则使用绝对路径;
##注意:标点符号都是英文的,sql文件中的时间变量必须是 &date 或 &yyyymmdd
sql_files = '测试脚本1.sql,测试脚本2.sql'
##sql语句中的导数日期 yesterday :表示昨天 ,目前只支持这一种情况,以后可以酌情增加其它日期
exp_date = 'yesterday'
##导出excel目录
excel_path = "/root/python/prod/test/data"
##导出excel文件sheet名,sheet名称与上面参数sql_files中的每个sql文件中sql条数一一对应,如果没有设置对应名称,则sheet名称默认
excel_sheet_names = [['测试脚本1'], ['测试脚本2'], ['测试脚本3']]
##导出exel文件是否压缩 1:压缩 0:不压缩 删除此参数
##is_zip = 1
##压缩后文件名前缀 ,压缩文件名=前缀+导数日期
zipfile_name = '测试脚本'
##是否发送邮件 1: 发送 0:不发送
is_mail = 1
##邮箱发送服务器
mail_server = 'smtp.163.com'
##邮箱发送服务器端口
mail_port = '25'
##发送邮件
mail_from = 'example@163.com'
##发送邮件密码
mail_pass = 'example'
##接收邮件
mail_to = 'xxxxxx@163.com,xxxxxx@qq.com'
##抄送邮件
mail_cc = 'xxxxxxxx@wo.cn,yyyyyy@126.com'
##邮件标题
mail_subject = '测试脚本'
##邮件内容
mail_body = """
<p>您好:</p>
<p> 提取数据见附件,请查收; </p>
<p></p>
<p></p>
<p>-------------------------------------------------------------------------------------</p>
<p> test </p>
<p> test </p>
<p> 系统在使用过程中如遇到问题,请及时与运维团队联系 </p>
<p> 热线电话:11111111111 </p>
<p> 运维邮箱:example@163.com </p>
"""
第二个执行脚本,如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cx_Oracle as cx
from openpyxl import Workbook
import datetime
import os
import zipfile
from config_ora2excel import * ##导入配置文件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email import encoders
from email.header import Header
from email.mime.base import MIMEBase
##设置环境变量,不知道为什么不生效,程序还是报错:Error: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or irectory". See https://oracle.github.io/odpi/doc/installation.html#linux for help
#os.environ['LD_LIBRARY_PATH'] = lib_path
#os.environ['NLS_LANG'] = nls_lan
#os.environ.setdefault("LD_LIBRARY_PATH", lib_path)
#os.environ.setdefault("NLS_LANG", nls_lan)
def get_yesterday():
today = datetime.date.today()
oneday = datetime.timedelta(days=1)
yesterday = today - oneday
return yesterday
def get_data_date():
# 获取数据日期
##data_date = input('请输入数据日期,格式yyyymmdd,默认为昨天:')
data_date = exp_date
if data_date.strip().lower() == 'yesterday':
yesterday = get_yesterday()
data_date = yesterday.strftime("%Y%m%d")
##print(data_date)
return data_date
def get_weeks():
#获取周次
data_date = get_data_date()
y = int(data_date[:4])
m = int(data_date[4:6])
d = int