Python远程连接oracle环境配置与批量插入数据

一、前言

oracle数据库算是一个大型的关系型数据库,一般企业单位存储大量数据会用的比较多。个人本地很少有安装oracle服务端,因此本文主要是介绍,pc安装oracle客户端,并且通过python连接远程oracle数据库的一般操作。具体用到了CX-Oracle这个第三方依赖库来实现python连接oracle。下面我们主要从客户端安装,环境配置,以及脚本实现来讲解如何实现python远程连接Oracle并且进行增删改查的操作。

二、实验环境

  • python3…7
  • Anaconda 集成环境
  • IDE Spyder
  • 操作系统:windows10
  • 依赖库 Cx_Oracle

三、 oracle客户端本地安装以及环境配置

对于客户端安装以及环境配置问题给我带来很大的困扰,按照网上的教程来做还是会出现一直报错的问题。最终通过一篇博客终于解决了环境配置问题。在这里,我参考那篇文章写一个完整的教程。

3.1 安装客户端和cx_Oracle包依赖

3.1.1 安装cx_Oracle包依赖

如果没有安装cx_Oracle包,可以在cmd状态下,到Python安装目录下,使用pip命令完成安装

pip install cx_Oracle

3.1.2 本地安装instantclient(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安装即可)。

Python远程连接oracle环境配置与批量插入数据_第1张图片

Python远程连接oracle环境配置与批量插入数据_第2张图片

将客户端压缩文件 instantclient-basic-windows.x64-19.3.0.0.0dbru.zip解压也就完成了客户端软件安装,下一步就是环境配置问题。

Python远程连接oracle环境配置与批量插入数据_第3张图片

  • 将软件的解压路径,path环境变量中,比如我的路径为G:\software\instantclient_19_3;如果本地还安装有oracle数据库,要添加到oracle的路径前面。

Python远程连接oracle环境配置与批量插入数据_第4张图片

  • 然后新建ORACLE_HOME,TNS_ADMIN,NLS_LANG 三个系统变量变量,NLS_LANG是为了防止中文乱码。

Python远程连接oracle环境配置与批量插入数据_第5张图片

  • 最后创建一个监听文件tnsnames.ora到G:\software\instantclient_19_3目录下,打开添加以下内容,并保存。
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为数据库服务器的实例名。

Python远程连接oracle环境配置与批量插入数据_第6张图片

  • 最后一步配置就是将解压的文件夹中的 oci.dll, oraocci19.dll,oraociei19.dll 拷贝到python安装目录下的lib/site-packages中。因为我装的anaconda环境,并且创建一个虚拟环境,因此只要将上述文件复制到对应虚拟环境的G:\Anaconda\envs\test\Lib\site-packages目录下即可。

Python远程连接oracle环境配置与批量插入数据_第7张图片

3.2 本地安装的instantclient软件卸载步骤

  • 系统的环境变量

删除 ORACLE_HOME,TNS_ADMIN, NLS_LANG 三个变量,修改path变量,去掉对应软件解压路径

  • 删除软件解压目录

!【注意】到这一步整体的环境配合以及软件安装都已经完成了,下面就是来测试python能够顺利的连接上远程数据库,并进行增删改查操作(如果连接还是报错,请先ping以下服务端是否正常开启)如果还不行,那就多查查吧,百度不行还有谷歌,问题总能解决

四、 python连接远程Oracle实现数据的增删改查操作

假设环境都已经配置完成,下一步就是利用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中

上述脚本的数据查询结果如下:

Python远程连接oracle环境配置与批量插入数据_第8张图片

###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') # 可以得到结果集

上述脚本的测试结果如下:

Python远程连接oracle环境配置与批量插入数据_第9张图片

###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()

五、参考文章链接和推荐的教程

  • (精品)Window下Python远程访问oracle 11g
  • Python远程连接服务器上的Oracle数据库
  • Python使用cx_Oracle模块操作Oracle数据库详解
  • Python读写及备份oracle数据库操作示例
  • 【Python + Oracle】—— Python批量插入Oracle数据库操作

你可能感兴趣的:(数据库相关(sql),python,oracle,sql)