背景:工作需要 需求:使用pycharm访问远程oracle类型数据库的表,表中包含lob字段(这也是个坑!)

麻了,搞了一个星期,终于成功了,真可谓是每步都有坑,看的文章也有小一百篇了,我要及时把自己的踩坑路总结出来,希望对你有用哟~

目录

一、在Pycharm中下载cx_Oracle包二、下载orcl instantclient三、复制3个dll后缀的文件至pychrm环境安装包的位置ps:还不行的话去设置下环境变量

四、查询表并输出数据框形式五、查询含有lob类型字段的表5.1 在Pycharm中下载sqlalchemy包5.2 查询数据库并访问表5.2.1 列表形式输出5.2.2 数据框形式输出

一、在Pycharm中下载cx_Oracle包

下载安装免费的Pycharm社区版参见pycharm Mac/windows(2022-2)之下载安装和设置中文 如果加载不成功,使用Anaconda Prompt在自己的环境中下载 我是在Pycharm终端执行如下代码

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple cx_Oracle

然后开开心心运行,本以为到这里就成功结束了

import cx_Oracle as oracle

#

def main():

# cx_Oracle.connect("用户名 / 密码@ Oracle服务器IP / Oracle的SERVICE_NAME")

db = oracle.connect('XXX/XXX@IP地址:端口/sid_name')#换成自己远程要连的库

c = db.cursor() # 获取cursor

x = c.execute("select * from XXX WHERE XXX") # 使用cursor进行各种查询操作

rows = c.fetchall()

for row in rows:

for v in row:

print(v)

c.close() # 关闭cursor

db.close() # 关闭连接

if __name__ == '__main__':

main()

然而上来就是个error! Cannot locate a 64-bit Oracle Client library: “The specified module could not be found”. 开始了漫长而无头绪的检索和阅读和尝试!没用的略过,有用的两步如下:

二、下载orcl instantclient

鉴于我之前已经下载并解压好了instantclient_21_12,如没下载请转至Oracle客户端官网 因为我的pycharm安装的是最新版,电脑也是最新版,无脑拣最新的上~

三、复制3个dll后缀的文件至pychrm环境安装包的位置

以我的为例,我用的是vene环境,可以点文件-设置-python解释器查看当前使用的环境 最简单的方式,把instantclient_21_12中的这三个文件选中复制 直接在pycharm中点开vene/Lib/site_packages,粘贴进来 粘贴完成后,再次运行就成功了,不行的话重启一下pycharm

ps:还不行的话去设置下环境变量

我的到步骤三就OK了,看自己情况 win11桌面右键,随便选一个显示设置/个性化,进入设置弹框页面,输入环境进行搜索 在用户变量新建一个变量名为instantclient,变量值为instantclient_21_12所在路径的东西 搞完后再次重启pycharm试试

四、查询表并输出数据框形式

#运行成功

import cx_Oracle as cx

import pandas as pd

def visitOracle(sql):

# cx_Oracle.connect("用户名 / 密码@ Oracle服务器IP / Oracle的SERVICE_NAME")

conn = cx.connect('XXX/XXX@IP地址:端口/sid_name')#换成自己远程要连的库

cursor = conn.cursor()

cursor.execute(sql) # 使用cursor进行各种操作

# 读取字段名

index = cursor.description

row = list()

for i in range(len(index)):

row.append(index[i][0])

# 获取返回信息

data = cursor.fetchall()

result = pd.DataFrame(list(data), columns=row)

# 关闭链接,释放资源

cursor.close()

conn.close()

return result

sql = "select * from XXX WHERE XXX'"

df = visitOracle(sql)

print(df)

如果是普通的表,是运行成功的,鉴于我的表有一个字段是长文本CLOB类型,所以它报错了 cx_Oracle.DatabaseError: DPI-1040: LOB was already closed 步骤五是我尝试成功的解决办法

五、查询含有lob类型字段的表

5.1 在Pycharm中下载sqlalchemy包

使用pip install sqlalchemy 和设置那里安装均失败SQLAlchemy · PyPI 安装指定版本也失败了使用镜像源安装成功!!

#pip3 install flask-sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple

pip3 install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple

5.2 查询数据库并访问表

5.2.1 列表形式输出

输出为外层列表,内里是元组的形式 [(number_value1,clob_value1),(number_value2,clob_value2),(number_value2,clob_value2)]

import cx_Oracle

# 连接到Oracle数据库

dsn = cx_Oracle.makedsn('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')

conn = cx_Oracle.connect(user='YOUR_USERNAME', password='YOUR_PASSWORD', dsn=dsn)

# 查询SQL

query = "select {number_column}, {clob_column} FROM {table_name} where rownum<=5"

# 执行查询

cursor = conn.cursor()

cursor.execute(query)

# 获取所有行

rows = cursor.fetchall()

print(rows)

#获取所有行也可以换成如下,输出结果是一样的

for row in cursor:

print(row)

5.2.2 数据框形式输出

#---------运行成功

import pandas as pd

import cx_Oracle

from sqlalchemy import create_engine

# 数据库连接信息

dsn_tns = cx_Oracle.makedsn('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')

conn_string = f"oracle+cx_oracle://{YOUR_USERNAME}:{YOUR_PASSWORD}@{dsn_tns}"

# 创建数据库引擎

engine = create_engine(conn_string)

# 构建SQL查询语句

query = f"select {number_column}, {clob_column} FROM {table_name} where rownum<=5"

# 使用pandas的read_sql_query方法执行查询并获取结果

df = pd.read_sql_query(query, con=engine)

print(df)

# 关闭数据库连接

engine.dispose()

或者下面的代码,自定义一个函数的形式,实现多次调用。

##----运行成功

import pandas as pd

import cx_Oracle as cx

from sqlalchemy import create_engine

def visitOracle(sql):

# 数据库连接信息

dsn_tns = cx.makedsn(('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')

conn = f"oracle+cx_oracle://{YOUR_USERNAME}:{YOUR_PASSWORD}@{dsn_tns}"

# 创建数据库引擎

engine = create_engine(conn)

# 使用pandas的read_sql_query方法执行查询并获取结果

df = pd.read_sql_query(sql, con=engine)

# 关闭数据库连接

engine.dispose()

return df

##诊疗记录

sql = "select {number_column}, {clob_column} FROM {table_name} where rownum<=5""

df = visitOracle(sql)

print(df)

以上两种代码都可以执行成功!!

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: