记录一下在工作中经常会使用python连接数据库,导出数据的一个小栗子,具体包含以下几个功能:
- 1. 按天循环查询数据库;
- 2. 查询数据库当前时间往前推7天的数据;
- 3. 将查询结果导出到Excel;
- 4. 计算整个执行过程的时间;
下面按照步骤逐步,具体每步的作用注释都有标明
1、导入相关模块
import openpyxl # 操作Excel表格
from openpyxl import Workbook
import cx_Oracle # 连接oracle数据库
import datetime # 获取日期时间
import time
2、连接oracle数据库,执行sql语句:
con = cx_Oracle.connect('Username/Password@IP:1521/LOCA') # 链接数据库
cur = con.cursor() # 获取游标
…… # 中间为连接数据库的操作
cur.close() # 关闭游标
con.close() # 关闭链接
3、根据当前时间向前获取7天的日期
now_time = datetime.datetime.now() # 获取当前时间
# 由于查询的是一整天的数据,这里我是直接写死每天的查询时间
time1 = "00:00:00"
time2 = "23:59:59"
for i in range(1,8,1): # 根据当前时间依次往前推,并做了日期格式转换
day = (now_time + datetime.timedelta(days=-i)).strftime('%Y-%m-%d')
start_time = day + " " + time1 # 日期和时间的拼接,定义查询的开始时间和结束时间
end_time = day + " " + time2
4、定义并执行sql语句
# 由于操作sql语句是在for循环内层,此处我单独列出来了
sql = "select * from t_record where create_date between to_date('%s','yyyy-mm-dd hh24:mi:ss') and to_date('%s','yyyy-mm-dd hh24:mi:ss') order by id desc"%(start_time,end_time) # 查询时间为变量,此处使用 %s 作为变量占位符
cur.execute(sql) # 执行sql查询
results = cur.fetchall() # 获取所有查询结果
5、将查询数据库结果保存到Excel中
# 获取行和列
rows = len(results)
if len(results):
cols = len(results[0]) # 判断list是否溢出,如果results为空,就退出
# 创建Excel表格
wb = Workbook()
ws = wb.create_sheet('Sheet1',0)
# 获取表头的字段值,即标题行
db_title = [i[0] for i in cur.description]
for i,description in enumerate(db_title):
ws.cell(row=1,column=1+i).value = description
# 循环查询结果行和列,存到Excel中
for m in range(rows):
for n in range(cols):
ws.cell(row=m+2,column=n+1).value = results[m][n] # 此处m+2,由于第一行为表头,因此从第二行开始存储
wb.save(filename = '%s.xlsx'%(day)) # 保存表格
6、计算整个执行过程时间
# 将这两句代码包裹其他代码
start = time.clock() # 放在代码开始执行的位置,开始计时
……
end = time.clock() # 放在代码结束执行的位置,结果计时
print('运行时间:%s' %(end - start)) # 格式转换,计算整个执行时间
下面是整段代码:
import openpyxl
from openpyxl import Workbook
import cx_Oracle
import datetime
import time
con = cx_Oracle.connect('Username/Password@IP:1521/LOCA') # 链接数据库
cur = con.cursor() # 获取游标
start = time.clock()
now_time = datetime.datetime.now()
time1 = "00:00:00"
time2 = "23:59:59"
for i in range(1,8,1):
day = (now_time + datetime.timedelta(days=-i)).strftime('%Y-%m-%d')
start_time = day + " " + time1
end_time = day + " " + time2
sql = "select * from t_record where create_date between to_date('%s','yyyy-mm-dd hh24:mi:ss') and to_date('%s','yyyy-mm-dd hh24:mi:ss') order by id desc"%(start_time,end_time)
# 执行sql查询
cur.execute(sql)
results = cur.fetchall()
# 获取行和列
rows = len(results)
if len(results):
cols = len(results[0]) # 判断list是否溢出
# 创建表格
wb = Workbook()
ws = wb.create_sheet('Sheet1',0)
# 获取表字段值
db_title = [i[0] for i in cur.description]
for i,description in enumerate(db_title):
ws.cell(row=1,column=1+i).value = description
for m in range(rows):
for n in range(cols):
ws.cell(row=m+2,column=n+1).value = results[m][n]
wb.save(filename = '%s.xlsx'%(day))
cur.close() # 关闭游标
con.close() # 关闭链接
end = time.clock()
print('运行时间:%s' %(end - start))
修改要连接的oracle信息,及要查询的sql语句,代码可以直接执行成功。