python3連接oracle數(shù)據(jù)庫

安裝navicat 時, 還有一點(diǎn)要注意,Oracle9i或以上版本的,要安裝Install Client11或以下;Oracle8或8i服務(wù)器,需要安裝Install Client10或以下。這個問題不大,因?yàn)槲覀儸F(xiàn)在的Oracle都是10或11了,注意一下就好。

1.首先安裝cx_Oracle包

pip install cx_Oracle
Python3.6
==注意==:
首先確定oracle服務(wù)是 11.2.0.1.0,復(fù)制那幾個包都要是11版本的,否則會報錯:

cx_Oracle.DatabaseError: DPI-1B58:
   Oracle Client library is at version 10.2 but.ersion 11-2 orhigher is needed

2.下載軟件包

instantclient-basic-windows.x64-12.1.0.2.0.zip
https://www.oracle.com/cn/database/technology/instant-client.html
或者
鏈接:https://pan.baidu.com/s/1A-b1sU-Xj0vra3HQiCMixA
提取碼:dyrm

3. 配置

將instantclient下所有.dll文件到python\Lib\site-packages\下
把下載的文件解壓,復(fù)制oci.dll,oraocci11.dll,oraociei11.dll的3個DLL粘貼到你的PY目錄的Libs/site-packages文件夾下面。

4. 測試代碼如下

示例 1:

import cx_Oracle #導(dǎo)入包
db = cx_Oracle.connect('用戶名','用戶密碼','ip:端口號/數(shù)據(jù)庫名') #連接數(shù)據(jù)庫
print(db.version) #打印版本看看 顯示 11.2.0.1.0
cur = db.cursor() # 游標(biāo)操作
cur.execute('select * from table') # 執(zhí)行sql語句
rows = cur.fetchall() # 獲取數(shù)據(jù)
# 打印數(shù)據(jù)
for row in rows[:10]:
   print(f"{row[0]} ,",end='')

結(jié)果如下所示:


示例 2:
安裝

pip install sqlalchemy -i http://pypi.douban.com/simple --trusted-host pipy.douban.com

SQLAlchemy本身無法操作數(shù)據(jù)庫,其必須以來cx_Oracle等第三方插件,Dialect用于和數(shù)據(jù)API進(jìn)行交流,根據(jù)配置文件的不同調(diào)用不同的數(shù)據(jù)庫API,從而實(shí)現(xiàn)對數(shù)據(jù)庫的操作,如:

MySQL-Python
    mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>

pymysql
    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

MySQL-Connector
    mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>

cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
from sqlalchemy import create_engine # 導(dǎo)入包
engine = create_engine('oracle+cx_oracle://user:pass@host:port/dbname') # 創(chuàng)建連接引擎
conn = engine.connect() # 連接數(shù)據(jù)庫
res = conn.execute('select * from table') # 執(zhí)行sql
res = res.fetchall() # 獲取所有數(shù)據(jù),這里返回的是list
print(res[:5]) #查看前5個數(shù)據(jù)

結(jié)果如下所示:

[('41403700', datetime.datetime(2020, 11, 21, 8, 0), Decimal('248.18'), Decimal('0.13'), Decimal('30.41'), None, None, '5', None, None, None, '20201123'), ('41403700', datetime.datetime(2020, 11, 11, 8, 0), Decimal('248.12'), Decimal('0.17'), Decimal('30.28'), None, None, '4', None, None, None, '20201118'), ('41403700', datetime.datetime(2020, 11, 1, 8, 0), Decimal('248.05'), Decimal('0.17'), Decimal('30.12'), None, None, '5', None, None, None, '20201108'), ('41403700', datetime.datetime(2020, 10, 21, 8, 0), Decimal('247.98'), Decimal('0.23'), Decimal('29.96'), None, None, '5', None, None, None, '20201026'), ('41403700', datetime.datetime(2020, 10, 11, 8, 0), Decimal('247.87'), Decimal('0.23'), Decimal('29.74'), None, None, '5', None, None, None, '20201018')]

中文亂碼的解決方案:

在python腳本中加入這幾句:

# -*- coding: utf-8 -*- 
import os 
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

6. 回到pandas

經(jīng)歷了sqlalchemy, 終于大概知道是怎么回事了,現(xiàn)在不影響我們使用pandas了,我們再次嘗試pandas的用法。

#! /usr/bin/env python
# -*- coding: utf-8 -*-

# 導(dǎo)入包
import os
from sqlalchemy import create_engine
import pandas as pd

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

# 同樣的套路,創(chuàng)建連接引擎
engine = create_engine('oracle+cx_oracle://user:pass@host:port/dbname')  

# with管理安全
with engine.connect() as conn, conn.begin():
    # 直接給出要查的表名,sql原生語句都不用寫了
    data = pd.read_sql_table('table_name', conn) 
print(data.head())  # 查看前5個數(shù)據(jù)

沒有得出結(jié)果,原因未知。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容