文章目录
1 背景
通过python连接oracle数据库,直接从数据库中抽取数据并进行计算分析
2 步骤
2.1 安装cx_Oracle
需要pip 安装cx_Oracle库
pip install cx_Oracle
2.2 安装 instantclient
2.3 查询SID
查询oracle的SID
select value from v$parameter where name like 'service_name%'
2.4 连接
2.4.1 方法1
代码如下:
import cx_Oracle
import pandas as pd
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' #设置解码格式,使查询结果可显示中文
conn=cx_Oracle.connect('username/password@192.168.*.**:1521/servename') #连接数据库(用户名/密码@IP:port/服务名)
c=conn.cursor() #获取cursor
c.execute("SELECT * FROM TABLENAME")
data=pd.DataFrame(c.fetchall()) #将查询结果转换为 DataFrame
colsname=c.description #获取列名称
namelist=[]
for i in range(len(colsname)):
namelist.append(colsname[i][0])
data.columns=namelist
data.set_index('colname',inplace=True) #设置 表 索引
print(data.head())
c.close() #关闭cursor
conn.close()
2.4.2 方法2
import os
import cx_Oracle as cx
#设置ORACLE驱动位置
os.environ['path'] = r'D:\Programs\instantclient-basic-windows.x64-11.2.0.4.0\instantclient_11_2'
def connDB():
try:
#地址、端口、SID
dsn = cx.makedsn('172.17.2.43', 1521, 'edp')
#账号、密码、服务器
db = cx.connect('TEST', '123456', dsn)
#创建游标
curs = db.cursor()
#组织查询语句
sql = 'SELECT sysdate FROM dual'
#执行语句
rr = curs.execute(sql)
#获取结果
row = curs.fetchone()
#列印结果
print(row[0])
#关闭游标
curs.close()
#关闭连线
db.close()
except Exception as e:
print(e)
if __name__ == '__main__':
connDB()
2.4.3 方法3
import cx_Oracle as cx
import os
import pandas as pd
#设置ORACLE驱动位置
os.environ['path'] = r'E:\instantclient-basic-windows.x64-12.2.0.1.0\instantclient_12_2'
#地址、端口、SID
dsn = cx.makedsn('地址',端口,'SID')
#账号、密码、服务器
db = cx.connect('账号', '密码', 服务器)
#创建游标 员工形象
curs_ygxx=db.cursor()
#组织查询语句
curs_ygxx.execute(
"""
WITH CANSHU AS
(
SELECT to_date(开始日期,'yyyymmdd') as 开始日期,
to_date(结束日期,'yyyymmdd') as 结束日期,
to_date(竞赛开始日期,'yyyymmdd') as 竞赛开始日期,
to_date(竞赛结束日期,'yyyymmdd') as 竞赛结束日期
FROM HR_参数表
where 项目='门店6S'
)
select to_char(检查日期,'yyyy-mm-dd') as 检查日期,
to_char(架构日期,'yyyy-mm-dd') as 架构日期,
事业部,大区,区域,归属门店,被考核人姓名,工号 as 被考核人工号,身份证号码,职位 as 被考核人职位,不合格原因,扣款金额
from CDM_HR_门店6S_员工形象
where trunc(检查日期,'mm')=(SELECT 开始日期 FROM CANSHU)
"""
)
data_ygxx=pd.DataFrame(curs_ygxx.fetchall()) #将查询结果转换为 DataFrame
colsname_ygxx=curs_ygxx.description #获取列名称
namelist_ygxx=[]
for i in range(len(colsname_ygxx)):
namelist_ygxx.append(colsname_ygxx[i][0])
data_ygxx.columns=namelist_ygxx #添加表名称
3 问题点
3.1
若连接中提示:
databaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded
解决方法见链接:
https://blog.csdn.net/guimaxingmc/article/details/80360840