暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python连接oracle数据库实践

Python数据分析实例 2021-02-21
1329
点击关注“Python数据分析实例

设为“置顶或星标”,送达干货不错过!

最近需要将一批数据从Oracle数据库导出为csv文件,打算用Python来实现,Python连接Oracle数据库比其他数据库稍微复杂一点。


本文分享这次连接实践,使用Python来操作Oracle数据库的关键点总结如下。


一、首先安装cx_oracle


cx_Oracle是一个Python 扩展模块,当于python的Oracle数据库的驱动,通过使用所有数据库访问模块通用的数据库 API来实现 Oracle 数据库的查询和更新。


方法一:官方网站下载安装

https://pypi.org/project/cx-Oracle/

复制


选择对应的系统及版本,然下载安装


方法二:通过pip安装


pip install cx_oracle -i https://pypi.douban.com/simple 

复制


备注:


1、安装的版本,我采取第二种方式安装的

pip show -f cx-Oracle

复制


2、Python版本

我的python版本为3.6.5


二、接着添加Oracle客户端配置


1、首先查看数据库版本,通过如下sql查看版本信息:

select * from v$version

#我的Oracle数据库版本号为:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

"CORE 11.2.0.1.0 Production"

TNS for 64-bit Windows: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

复制

2、下载Oracle数据库对应的客户端


具体下载地址如下:

https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html


选择对应的操作系统和版本

我的数据库版本是:11.2.0.1.0,选择了最接近的11.2.0.4.0,所以我下载的客户端版本为instantclient-basic-windows.x64-11.2.0.4.0.zip

3、然后解压,并将解压后的地址信息加入到操作系统环境变量中

比如我的文件夹路径为:E:\Oracle11g\product\11.2.0\instantclient_11_2


4、将文件中后缀为 dll 的文件复制到 anaconda 安装位置,同上添加在path这个变量下。



通过以上步骤,Oracle客户端配置完成


三、最后配置TNS

1、创建tnsnames.ora文件
通过远程服务,进入数据库部署服务器端,进入如下目录,并创建tnsnames.ora文件。

如果没有可以手动创建(我是之前安装过完整版客户端,所以已经有了,一般都有配置过,只需要打开文件获取关键信息如host、port、service_name即可

D:\app\myUserName\product\11.2.0\dbhome_1\NETWORK\ADMIN

2、配置数据库信息


tnsnames.ora Network Configuration File(TNS配置),格式如下: 


ORCL =
   (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = 1521))
     (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SERVICE_NAME = orcl) 
     )
   )

复制
host就是你的数据库ip地址,PORT就是数据库端口,SERVICE_NAME是创建数据库的时候设置。

四、注意事项


很多人在进行以上步骤都遇到了很多问题,比如报错信息如下:
cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded:  "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html

复制

解决思路:查询python版本和Oracle数据库客户端版本是否一致;python安装根目录下复制Oracle配置的dll文件。

sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的 SID

复制


解决思路:cx_Oracle默认的连接串只能连接到实例名,而不能连接到service_name,名和service_name有时候配置不一样,所以oracle用service_name去匹配实例名,可能找不到

所以连接时必须指定连的是service_name,查阅配置的tnsname.ora文件,找到service_name即可。


五、测试创建连接

Python连接Oracle数据测试方法

from sqlalchemy import create_engine
import pandas as pd

#避免编码问题带来的乱码
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
#连接oracle
#方法1:sqlalchemy 提供的create_engine()
engine = create_engine('oracle+cx_oracle://username:password@ip:1521/ORCL')

#engine = create_engine("dialect+driver://username:password@host:port/database")
#参数说明:
#dialect,数据库类型,包括:sqlite, mysql, postgresql, oracle,  mssql等
#driver,指定连接数据库的API,如:`psycopg2``, ``pyodbc``, ``cx_oracle``等,为可选关键字。
#username,用户名
#password,密码
#host,网络地址,可以用ip。
#port,数据库端口。
#database,数据库名称。

#执行Oracle SQL语句
sql='select * from b_build_info'

# 查询获取数据用sql语句
#Pandas读写操作Oracle数据库

df = pd.read_sql_query(sql, engine)
df1=pd.DataFrame(df)

print(df1)

engine.close()


# 方法2:cx_Oracle.connect()
engine=cx_Oracle.connect('username','password','ip:1521/ORCL')

#创建游标并赋给变量cursor
execsql=engine.cursor()

#执行Oracle SQL语句
sql='select * from b_build_info'

execsql.execute(sql)

#获取执行结果
#这里fetchone表示获取一行,fetchall为获取所有行
#fetchone返回的是一个字符串
#fetchall返回的是一个列表,哪怕结果只有一行

result=execsql.fetchall()
# 获取结果列(数据库字段名)
titles = cursor.description

#打印结果
print (pd.DataFrame(result))

#关闭数据库连接
execsql.close()
engine.close()


复制

如果你能正常打印数据库查询数据,恭喜你取得成功。


这是一个能学到技术的公众号,欢迎关注

Python数据分析实例   

长按二维码,关注我的公众号

微信改版,快快设为星标
记得点在看👇
复制

点个赞,点个在看再走吧~~~




文章转载自Python数据分析实例,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论