背景:工作需要
需求:使用pycharm訪問遠(yuǎn)程oracle類型數(shù)據(jù)庫的表,表中包含lob字段(這也是個坑?。?/strong>
麻了,搞了一個星期,終于成功了,真可謂是每步都有坑,看的文章也有小一百篇了,我要及時把自己的踩坑路總結(jié)出來,希望對你有用喲~
一、在Pycharm中下載cx_Oracle包
下載安裝免費的Pycharm社區(qū)版參見pycharm Mac/windows(2022-2)之下載安裝和設(shè)置中文
如果加載不成功,使用Anaconda Prompt在自己的環(huán)境中下載
我是在Pycharm終端執(zhí)行如下代碼
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple cx_Oracle
然后開開心心運行,本以為到這里就成功結(jié)束了
import cx_Oracle as oracle
#
def main():
# cx_Oracle.connect("用戶名 / 密碼@ Oracle服務(wù)器IP / Oracle的SERVICE_NAME")
db = oracle.connect('XXX/XXX@IP地址:端口/sid_name')#換成自己遠(yuǎn)程要連的庫
c = db.cursor() # 獲取cursor
x = c.execute("select * from XXX WHERE XXX") # 使用cursor進(jìn)行各種查詢操作
rows = c.fetchall()
for row in rows:
for v in row:
print(v)
c.close() # 關(guān)閉cursor
db.close() # 關(guān)閉連接
if __name__ == '__main__':
main()
然而上來就是個error!
Cannot locate a 64-bit Oracle Client library: “The specified module could not be found”.
開始了漫長而無頭緒的檢索和閱讀和嘗試!沒用的略過,有用的兩步如下:
二、下載orcl instantclient
鑒于我之前已經(jīng)下載并解壓好了instantclient_21_12,如沒下載請轉(zhuǎn)至Oracle客戶端官網(wǎng)
因為我的pycharm安裝的是最新版,電腦也是最新版,無腦揀最新的上~
三、復(fù)制3個dll后綴的文件至pychrm環(huán)境安裝包的位置
以我的為例,我用的是vene環(huán)境,可以點文件-設(shè)置-python解釋器查看當(dāng)前使用的環(huán)境
最簡單的方式,把instantclient_21_12中的這三個文件選中復(fù)制
直接在pycharm中點開vene/Lib/site_packages,粘貼進(jìn)來
粘貼完成后,再次運行就成功了,不行的話重啟一下pycharm
ps:還不行的話去設(shè)置下環(huán)境變量
我的到步驟三就OK了,看自己情況
win11桌面右鍵,隨便選一個顯示設(shè)置/個性化,進(jìn)入設(shè)置彈框頁面,輸入環(huán)境進(jìn)行搜索
在用戶變量新建一個變量名為instantclient,變量值為instantclient_21_12所在路徑的東西
搞完后再次重啟pycharm試試
四、查詢表并輸出數(shù)據(jù)框形式
#運行成功
import cx_Oracle as cx
import pandas as pd
def visitOracle(sql):
# cx_Oracle.connect("用戶名 / 密碼@ Oracle服務(wù)器IP / Oracle的SERVICE_NAME")
conn = cx.connect('XXX/XXX@IP地址:端口/sid_name')#換成自己遠(yuǎn)程要連的庫
cursor = conn.cursor()
cursor.execute(sql) # 使用cursor進(jìn)行各種操作
# 讀取字段名
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)
# 關(guān)閉鏈接,釋放資源
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
步驟五是我嘗試成功的解決辦法
五、查詢含有l(wèi)ob類型字段的表
5.1 在Pycharm中下載sqlalchemy包
- 使用pip install sqlalchemy 和設(shè)置那里安裝均失敗
- SQLAlchemy · PyPI 安裝指定版本也失敗了
- 使用鏡像源安裝成功?。?/li>
#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 查詢數(shù)據(jù)庫并訪問表
5.2.1 列表形式輸出
輸出為外層列表,內(nèi)里是元組的形式
[(number_value1,clob_value1),(number_value2,clob_value2),(number_value2,clob_value2)]
import cx_Oracle
# 連接到Oracle數(shù)據(jù)庫
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"
# 執(zhí)行查詢
cursor = conn.cursor()
cursor.execute(query)
# 獲取所有行
rows = cursor.fetchall()
print(rows)
#獲取所有行也可以換成如下,輸出結(jié)果是一樣的
for row in cursor:
print(row)
5.2.2 數(shù)據(jù)框形式輸出
#---------運行成功
import pandas as pd
import cx_Oracle
from sqlalchemy import create_engine
# 數(shù)據(jù)庫連接信息
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}"
# 創(chuàng)建數(shù)據(jù)庫引擎
engine = create_engine(conn_string)
# 構(gòu)建SQL查詢語句
query = f"select {number_column}, {clob_column} FROM {table_name} where rownum<=5"
# 使用pandas的read_sql_query方法執(zhí)行查詢并獲取結(jié)果
df = pd.read_sql_query(query, con=engine)
print(df)
# 關(guān)閉數(shù)據(jù)庫連接
engine.dispose()
或者下面的代碼,自定義一個函數(shù)的形式,實現(xiàn)多次調(diào)用。文章來源:http://www.zghlxwxcb.cn/news/detail-813756.html
##----運行成功
import pandas as pd
import cx_Oracle as cx
from sqlalchemy import create_engine
def visitOracle(sql):
# 數(shù)據(jù)庫連接信息
dsn_tns = cx.makedsn(('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')
conn = f"oracle+cx_oracle://{YOUR_USERNAME}:{YOUR_PASSWORD}@{dsn_tns}"
# 創(chuàng)建數(shù)據(jù)庫引擎
engine = create_engine(conn)
# 使用pandas的read_sql_query方法執(zhí)行查詢并獲取結(jié)果
df = pd.read_sql_query(sql, con=engine)
# 關(guān)閉數(shù)據(jù)庫連接
engine.dispose()
return df
##診療記錄
sql = "select {number_column}, {clob_column} FROM {table_name} where rownum<=5""
df = visitOracle(sql)
print(df)
以上兩種代碼都可以執(zhí)行成功!!文章來源地址http://www.zghlxwxcb.cn/news/detail-813756.html
到了這里,關(guān)于使用pycharm連接讀取orcl數(shù)據(jù)庫的表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!