python直接连接oracle_Python 链接oracle数据库(直接读入成dataframe)

python做科学计算是所有除编译语言最快的,原因在于python的numpy直接封装了大量优化性能最好的c库。

做数据操作也是我接触过最方便的(保留意见),因为基于pandas提供了大量的简易化数据操作api。

数据库:数据库提供高效简易的数据结构化查询语言,和excel一样属于很伟大的创作。

但数据库有的时候会面临一个问题:当我们遇到较为复杂的逻辑化数据操作的时候,sql语言有时候借助存储过程,(尤以付费的oracle 提供了多于mysql的方法)也能实现操作,但较之于服务端语言(如java,python)等实在是有点费劲且不讨好。

所以,我们希望可以把数据库的表式数据,直接读为python里pandas。datafram的表式数据,然后实现复杂逻辑的数据变换。

工具:python,oracle; python插件:cx_oracle,sqlalchemy,pandas,以及oracle的oci组件。(相比较于mysql确实费劲不少,mysql的链接可百度或者见之前的文章)

准备工作

1.oci 64位

oracle是远程服务器,应该是64位,但这边plsql(oracle的一款开发中间件)使用oracle的oci是32位,navicat用这个32位的也能连。唯独python报64位的oci无法被loaded。

因为plsql和navicat都在配置文件里指定了32位oci的位置,所以我决定下一个64位的oci放到环境变量里,把之前的32位环境换掉(两款软件都指定了位置,所以不影响使用 )http://jvniu.jb51.net:81/201708/tools/instantclientx64_jb51.rar​jvniu.jb51.net:81

上面是下载地址,解压然后把目录加入环境变量里就好了。

2.cx_oracle

这个是驱动,mysql的就是mysqldb(新版为mysqlclient)和pymysql。

这个驱动也要对应。

我的系统是win64 python 64位,所以只要amd64 python3.6版本。(ps,pip也能直接安装,但不建议,我的就出错。)cx_Oracle​pypi.org

这个是5.3版本,最新是7.0,建议用老版本。

3.oracle servername问题

import sqlalchemy

import pyodbc

engine = sqlalchemy.create_engine("mssql+pyodbc://:@")

# write the DataFrame to a table in the sql database

df.to_sql("table_name", engine)

sqlalchemy create engine(数据库类型+驱动[oracel默认是cx]+用户+密码+服务器+库名)如果只是本地普通的mysql或者oracle 完全ojb8k。

但是正式的业务环境都是主备集群等,外加网络ip限制,以此来容灾。

如oracel 有severename的设置,在oracle network/admin下有一个配置文件,navicat直接有服务名的填写项,但python这里没有。

所以我们用驱动来生成这样一个记载信息的token。

import pandas as pd

from sqlalchemy import create_engine

import cx_Oracle

dns = cx_Oracle.makedsn('hostip','端口',service_name='服务名')

from sqlalchemy import create_engine

engine = create_engine("oracle://用户:密码@"+dns,encoding='utf-8', echo=True)

data = pd.read_sql('SELECT * FROM 库.表', engine)

print(data)

注意:这里我尝试把库加在引擎里面,失败,所以放在了readsql里。链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值