oracle数据库算是一个大型的关系型数据库,一般企业单位存储大量数据会用的比较多。个人本地很少有安装oracle服务端,因此本文主要是介绍,pc安装oracle客户端,并且通过python连接远程oracle数据库的一般操作。具体用到了CX-Oracle这个第三方依赖库来实现python连接oracle。下面我们主要从客户端安装,环境配置,以及脚本实现来讲解如何实现python远程连接Oracle并且进行增删改查的操作。
对于客户端安装以及环境配置问题给我带来很大的困扰,按照网上的教程来做还是会出现一直报错的问题。最终通过一篇博客终于解决了环境配置问题。在这里,我参考那篇文章写一个完整的教程。
如果没有安装cx_Oracle包,可以在cmd状态下,到Python安装目录下,使用pip命令完成安装
pip install cx_Oracle
Oracle官网
从中选择对应的版本进行下载。要在Python和Oracle数据库中使用cx_Oracle,您需要下载对应Python版本,操作系统版本,数据库版本。最简单的办法就是全部都安装最新版本,我这里对应的是python3.7,instantclient_19_3( instantclient-basic-windows.x64-19.3.0.0.0dbru.zip),cx-Oracle 7.2.3(直接pip安装即可)。
将客户端压缩文件 instantclient-basic-windows.x64-19.3.0.0.0dbru.zip解压也就完成了客户端软件安装,下一步就是环境配置问题。
oral=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST= 192.168.1.66)(PORT =1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oral)
)
)
主要可以修改三个参数:1、前面的别名(可以自定义替换)
2、Host为IP地址
3、SERVICE_NAME为数据库服务器的实例名。
删除 ORACLE_HOME,TNS_ADMIN, NLS_LANG 三个变量,修改path变量,去掉对应软件解压路径
!【注意】到这一步整体的环境配合以及软件安装都已经完成了,下面就是来测试python能够顺利的连接上远程数据库,并进行增删改查操作(如果连接还是报错,请先ping以下服务端是否正常开启)如果还不行,那就多查查吧,百度不行还有谷歌,问题总能解决
假设环境都已经配置完成,下一步就是利用python实现远程访问oracle数据库。我们这里主要讲一下查询和批量插入。
###4.1 pyton连接oracle实现查询,并直接转化为数据帧
代码如下:
# -*- coding: utf-8 -*-
import cx_Oracle
import pandas as pd
#获取数据库连接
#connection=cx_Oracle.connect("用户名","密码","localhost:端口号/实例名",encoding='UTF-8', nencoding='UTF-8')
print('oracle数据库客户端版本:%s'% str(cx_Oracle.clientversion()))
#cursor = connection.cursor()#获取cursor
sql = 'SELECT * FROM SCOPUS.AI_CONCEPT_GROUP'
#x = cursor.execute(sql)
#xx = x.fetchmany(5)
results = pd.read_sql(sql,connection)## 使用pandas 的read_sql函数,可以直接将数据存放在dataframe中
上述脚本的数据查询结果如下:
###4.2 pyton连接oracle实现查询封装为一个函数
def query(sql):
#scott是数据用户名,tiger是登录密码(默认用户名和密码)
conn = cx_Oracle.connect("用户名","密码","localhost:端口号/实例名",encoding='UTF-8', nencoding='UTF-8')
print('oracle数据库客户端版本:%s'% str(cx_Oracle.clientversion()))
# 使用pandas 的read_sql函数,可以直接将数据存放在dataframe中
results = pd.read_sql(sql,conn)
conn.close
return results
test_data = query('SELECT SCOPUS.AI_GROUP.NAME_CH AS GROUP1 ,SCOPUS.AI_CONCEPT_GROUP.NAME_CH AS CONCEPT FROM SCOPUS.AI_CONCEPT_GROUP, SCOPUS.AI_GROUP WHERE AI_GROUP.GROUPID = AI_CONCEPT_GROUP.GROUPID') # 可以得到结果集
上述脚本的测试结果如下:
###4.3 pyton连接oracle实现插入数据
#工具库导入
import pandas as pd
import cx_Oracle
#实现插入功能
def input_to_db(data,sql):
connection = cx_Oracle.connect("用户名","密码","localhost:端口号/实例名",encoding='UTF-8', nencoding='UTF-8')
#建立游标
cursor = connection.cursor()
#逐行插入数据
for i in range(len(data)):
name= data.ix[i,0]
gender= data.ix[i,1]
age= data.ix[i,2]
# 执行sql语句
cursor.execute(sql % (name,gender,age))
connection.commit()
# 关闭游标
cursor.close()
connection.close()
#测试插入数据库
#测试数据集
test_data = pd.DataFrame([['小明','男',18],['小芳','女',18]],index = [1,2],columns=['name','gender','age'])
#调用函数实现插入
input_to_db(test_data,test_table1)
###4.4 pyton连接oracle实现增删改查封装为一个类
# -*- coding: utf-8 -*-
# =============================================================================
# oracle数据库操作函数类
# =============================================================================
import cx_Oracle
import os
import json
import pandas as pd
#os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
"""python version 3.7"""
class TestOracle:
def __init__(self,user,pwd,ip,port,sid):
self.connect=cx_Oracle.connect(user+"/"+pwd+"@"+ip+":"+port+"/"+sid,encoding='UTF-8', nencoding='UTF-8')
self.cursor=self.connect.cursor()
self.pd = pd
print('oracle数据库客户端版本:%s'% str(cx_Oracle.clientversion()))
"""处理数据二维数组,转换为json数据返回"""
def select_tojson(self,sql):
list=[]
self.cursor.execute(sql)
result=self.cursor.fetchall()
col_name=self.cursor.description
for row in result:
dict={
}
for col in range(len(col_name)):
key=col_name[col][0]
value=row[col]
dict[key]=value
list.append(dict)
js=json.dumps(list,ensure_ascii=False,indent=2,separators=(',',':'))
return js
'''利用sql查询语句将筛选的数据转化为数据帧返回'''
def select_topd(self,sql):
results = pd.read_sql(sql,self.connect)
self.connect.close()
return results
def disconnect(self):
self.cursor.close()
self.connect.close()
def insert(self,sql,list_param):
try:
self.cursor.executemany(sql,list_param)
self.connect.commit()
print("插入ok")
except Exception as e:
print(e)
finally:
self.disconnect()
def update(self,sql):
try:
self.cursor.execute(sql)
self.connect.commit()
except Exception as e:
print(e)
finally:
self.disconnect()
def delete(self,sql):
try:
self.cursor.execute(sql)
self.connect.commit()
print("delete ok")
except Exception as e:
print(e)
finally:
self.disconnect()