设为“置顶或星标”,送达干货不错过!
最近需要将一批数据从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文件
2、配置数据库信息
tnsnames.ora Network Configuration File(TNS配置),格式如下:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)复制
四、注意事项
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
复制
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数据分析实例
长按二维码,关注我的公众号
微信改版,快快设为星标吧⭐ 记得点在看哦👇 复制
点个赞,点个在看再走吧~~~
