pandas读取外部数据---(5)python(pandas)连接操作Oracle数据库

 

目录

1、前言

2、windows系统python(pycharm)安装cx_Oracle

2.1、常见错误需要一个64位的的oci.dll

3、Pandas读写操作Oracle数据库

3.1、Pandas连接Oracle并使用sql语句查询数据

3.2、使用Pandas连接Oracle 并插入数据


1、前言

pandas不仅限于读取本地的离线文件,也可以在线读取数据库的数据,处理后再写回数据库中。pandas主要是以sqlalchemy方式与数据库建立链接,支持Mysql、postgresql、Oracle、MS SQLServer、SQLite等主流数据库。而且语法基本一致。

sqlalchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具。可以使用pip命令安装sqlalchemy模块:pip install sqlalchemy
sqlalchemy模块提供了create_engine('数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名')函数用来初始化数据库连接。

或者用python的cx_Oracle模块也是可以的。cx_Oracle模块提供了cx_Oracle.connect('用户名','口令','机器地址:端口号/数据库名') 函数用来初始化数据库连接。

需要三个库

  • pandas :pip install pandas
  • sqlalchemy :pip install sqlalchemy
  • cx_Oracle : 安装cx_Oracle会比较繁琐一些

2、windows系统python(pycharm)安装cx_Oracle

下面我们来实现cx_Oracle的安装。

注意:传统安装时,python版本、cx_Oracle版本与oracle instantclient版本必须严格匹配,相对复杂。

这里我们避开版本选择问题,使用pycharm来安装。我们习惯性的pip/conda install cx_Oracle来安装模块,但cx_Oracle这样安装经常报错。来个简单的安装方式,首先我们得先卸载了原有的或者安装了不能使用的cx_Oracle,pip uninstall cx_Oracle。

卸载了还不够,找到我们pycharm调用模块的文件夹,把所有关于cx_Oracle/oracle的文件夹都干掉,路径一般为:...\untitled\venv\Lib\site-packages 和...\untitled\venv两个地方,我自己的是 D:\PycharmProjects\untitled\venv\Lib\site-packages 和D:\PycharmProjects\untitled\venv

接下来,在pycharm -->file-->settings-->project:你的工程名称-->project interpreter--> +  

输入cx_Oracle(如果没有就输入cx-Oracle) ,找到cx_Oracle(或者cx-Oracle),点击install package安装,安装完成点击ok。刷新一下就行了。

2.1、常见错误

错误

Python连接Oracle数据库时报错"64-bit Oracle Client library cannot be loaded: "D:\oracle\product\10.1.3\db_1\BIN\oci.dll

原因:

Python3.x版本64位   oracle10g /11g... 32位  sqlplus 32位,连接后,报错如上。需要一个64位的的oci.dll

windows7/8/10 解决办法:

1)下载 instantclient-basic 64位的 地址:https://download.csdn.net/download/weixin_41685388/12073800

2)下载后解压放到oracle安装目录下:D:\oracle\product\instantclient_11_2

3)设置用户环境变量path添加 : D:\oracle\product\instantclient_11_2;  

4)配置完环境变量后,重启pycharm,run项目,问题就解决了,这时pycharm可能需要初始化,按照提示选择执行代码的目录,设置run的默认执行路径

3、Pandas读写操作Oracle数据库

3.1、Pandas连接Oracle并使用sql语句查询数据

create_engine('数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名') 
或者
cx_Oracle.connect('用户名','口令','机器地址:端口号/数据库名')

# -*- coding: utf-8 -*-
from sqlalchemy import create_engine
import pandas as pd
import cx_Oracle
#避免编码问题带来的乱码
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
#连接oracle
#方法1:sqlalchemy 提供的create_engine()
engine = create_engine('oracle+cx_oracle://scott:[email protected]:1521/ORCL')
#方法2:cx_Oracle.connect()
db=cx_Oracle.connect('scott','tiger','127.0.0.1:1521/ORCL')
print(db.version)

#查询获取数据用sql语句
sql = 'SELECT * FROM emp'
sql2 = 'select * from dept'
df = pd.read_sql_query(sql, engine)
df2 = pd.read_sql_query(sql2, db)
print(df,'\n',df2)

3.2、使用Pandas连接Oracle 并插入数据

# -*- coding: utf-8 -*-
from sqlalchemy import create_engine
import pandas as pd
import cx_Oracle
#避免编码问题带来的乱码
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
#连接oracle
#方法1:sqlalchemy 提供的create_engine()
engine = create_engine('oracle+cx_oracle://scott:[email protected]:1521/ORCL',echo=False,encoding='utf-8')
#方法2:cx_Oracle.connect()
# db=cx_Oracle.connect('scott','tiger','127.0.0.1:1521/ORCL')
# print(db.version)

# 直接写入数据-->ordf-->ordf表会自动创建
# 新建pandas中的DataFrame, 只有id,num两列
df = pd.DataFrame({'id': [1, 2, 3, 4], 'name': ['jalen', 'xr', 'lili', '小牛']})
# 将新建的DataFrame储存为MySQL中的数据表,储存index列
df.to_sql('ordf', engine, index=True)
print('Read from and write to oracle table successfully!')
# if_exists的三个选择
  # fail的意思如果表存在,啥也不做
  # replace的意思,如果表存在,删了表,再建立一个新表,把数据插入
  # append的意思,如果表存在,把数据插入,如果表不存在创建一个表!!
# 在存在的表中追加数据-->ordf
df1 = pd.DataFrame({'id': [5, 6, 7, 8], 'name': ['老夏', '小夏', '啊夏', '夏哥']})
df1.to_sql('ordf', engine, index=True, if_exists='append')
print('Append data to oracle database successfully!')

Pandas读写操作Mysql数据库:https://blog.csdn.net/weixin_41685388/article/details/103770964

发布了103 篇原创文章 · 获赞 75 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41685388/article/details/103791970