记录一下在工作中经常会使用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语句,代码可以直接执行成功。