python -- 鏈接 orclae cx_Oracle的使用 二

轉:https://www.cnblogs.com/cyxiaer/p/9396861.htmlhtml

 

必需的Oracle連接庫的下載地址:https://www.oracle.com/technetwork/topics/winx64soft-089540.htmlpython

只鏈接數據庫的話沒必要安裝客戶端:sql

1. 把cx_Oracle的客戶端文件複製到site-packages/ 目錄下,多是Python, Anaconda, venv下面的安裝包裏數據庫

2. 把下載的instantclient文件夾下的.dll文件所有複製到site-packages/ 目錄下windows

3. 把instantclient文件解壓後的地址添加到環境變量裏面去。網絡

4. 建立數據庫鏈接.oracle

建立數據庫鏈接connect和關閉數據庫鏈接close

建立數據庫鏈接的三種方式:python2.7

方法一:用戶名、密碼和監聽分開寫函數

import cx_Oraclefetch

db=cx_Oracle.connect('username/password@host/orcl')

db.close()

 

方法二:用戶名、密碼和監聽寫在一塊兒

import cx_Oracle

db=cx_Oracle.connect('username','password','host/orcl')

db.close()

 

方法三:配置監聽並鏈接

import cx_Oracle

tns=cx_Oracle.makedsn('host',1521,'orcl')

db=cx_Oracle.connect('username','password',tns)

db.close()

 

cx_Oracle錯誤:Unable to acquire Oracle environment handle

錯誤表現:
cx_Oracle鏈接Oracle數據庫的時候報錯:
cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle

解決辦法:將instantclient目錄下的全部*.dll文件拷貝到Python27\Lib\site-packages目錄下,問題解決

SQLAlchemy Oracle 的中文問題

你須要設置 NLS_LANG 環境變量,不然你讀取出來的中文多是亂碼,或者當 insert 的數據有中文時會致使 Unicode 編碼錯誤。

你能夠在 Python 代碼中這麼設置環境變量

# 設置編碼,不然: # 1. Oracle 查詢出來的中文是亂碼 # 2. 插入數據時有中文,會致使 # UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-7: ordinal not in range(128) os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

No module named cx_Oracle:
import cx_Oracle ImportError: No module named cx_Oracle

若是安裝的 python 64 位,須要把cx_Oracle文件複製到 /usr/lib64/python2.7/site-packages/ 目錄下

cd /usr/lib/python2.7/site-packages/ cp cx_Oracle.so /usr/lib64/python2.7/site-packages/cx_Oracle.so cp cx_Oracle-5.1.2-py2.7.egg-info /usr/lib64/python2.7/site-packages/cx_Oracle-5.1.2-py2.7.egg-info

UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position ... 問題解決辦法

目標文件的編碼是致使標題所指問題的罪魁禍首
f = open("out.html","w")

,在windows下面,新文件的默認編碼是gbk,這樣的話,python解釋器會用gbk編碼去解析咱們的網絡數據流txt,然而txt此時已是decode過的unicode編碼,這樣的話就會致使解析不了,出現上述問題。 解決的辦法就是,改變目標文件的編碼:

f = open("out.html","w",encoding='utf-8')
問題解決。

1. cx_Oracle
cx_Oracle模塊是Python鏈接Oracle數據庫的模塊,在Python中,若是要鏈接Oracle,必須先安裝cx_Oracle模塊。 
cx_Oracle的下載地址:https://pypi.python.org/pypi/cx_Oracle/ 
選擇和操做系統、Python版本一致的安裝包進行安裝。固然爲了省事兒,你也能夠直接使用pip命令來安裝cx_Oracle。

pip install cx_Oracle

安裝完成後,在交互模式下輸入import cx_Oracle,不報錯,說明安裝成功。

2. 鏈接Oracle數據庫
方法一:用戶名、密碼、監聽分開寫

import cx_Oracle
db=cx_Oracle.connect('username','password','host:port/sid')


方法二:用戶名、密碼、監聽寫一塊兒

import cx_Oracle 
db=cx_Oracle.connect('username/password@host:port/sid') 

方法三:先配置監聽,後鏈接

import cx_Oracle 
tnsname = cx_Oracle.makedsn('host', port,'sid') 
db = cx_Oracle.connect('username','password',tnsname) 

說明:代碼中username、password、host、port、sid換成實際數據庫的用戶名、密碼、主機名或主機IP、數據庫實例名。

3. 建立遊標
cx_Oracle中,對於數據庫的增刪改查操做須要經過遊標來進行,遊標的建立語句以下:

cur=db.cursor()

4. 執行sql語句
Sql語句書寫:不須要從外部傳入參數,能夠直接書寫sql語句,而後使用execute執行sql便可;若是須要從外部傳入參數,在須要傳入參數的地方使用變量,並在變量前加「:」,而後經過prepare加載sql語句。

cur.prepare:若是執行的sql語句須要傳外部參數,能夠先用這個函數加載sql語句,而後再經過execute或executemany加參數執行。
cur.execute:執行單條sql語句。
cur.executemany:執行多條sql語句。
關於execute須要說明的是若是執行的sql語句不須要從外部傳入參數,那麼能夠跳過prepare,直接將sql語句做爲execute的第一個參數來執行sql。

db.commit():執行提交操做,增、刪、改後須要使用。
cur.fetchall:在查詢以後使用,獲取全部查詢到的結果記錄。
cur.fetchone:在查詢以後使用,獲取一條查詢到的結果記錄。
關於fetchall和fetchone須要說明的是查詢到的記錄一旦被提取,就不能再次被提取,無論是用fetchall提取仍是使用fetchone提取。

res = cur.fetchall()[0][0].read();

fetchall和fetchone返回的是元組,加上[][],能夠直接取到值。

for result in cur:  #循環從遊標獲取每一行並輸出該行。
    print result
寫完遊標能夠去循環遊標讓它輸出結果。
 

查詢: 
須要外部參數:

>>> cur.prepare('select * from t_emp a where a.empid=:id')
>>> cur.execute(None,{'id':id})
<cx_Oracle.Cursor on <cx_Oracle.Connection to cs@192.168.1.226:1521/db_emp>>
>>> cur.fetchall()

不須要外部參數:

>>> cur.execute("select e.empid,e.empname from t_emp e")
<cx_Oracle.Cursor on <cx_Oracle.Connection to cs@192.168.102.219:1521/t45>>
>>> cur.fetchone()
(1, '張三')
>>> cur.fetchall()
[(2, '李四'), (3, '王五'), (4, '沈六'), (5, '田七'), (6, '鳳九')]

增長、刪除、修改:

單條增長:

>>> sql="insert into t_emp(empid,empname) values (:empid,:empname)"
>>> cur.prepare(sql)
>>> cur.execute(None,{'empname':'李紳','empid':7})
>>> db.commit()

多條增長:

>>> sql="insert into t_emp(empid,empname) values (:empid,:empname)"
>>> cur.prepare(sql)
>>> cur.executemany(None,[{'empname':'趙青','empid':8},{'empname':'蕭遠','empid':9}])
>>> db.commit()

單條修改:

>>> sql="update t_emp a set a.empname='清月' where a.empid=:empid"
>>> cur.prepare(sql)
>>> cur.execute(None,{empid:"4"})
>>> db.commit()

多條修改:

>>> sql="update t_emp a set a.empname=:empnamewhere a.empid=:empid"
>>> cur.prepare(sql)
>>> cur.executemany(None,[{'empid':"5","empname":"明月"},{'empid':"6","empname":"樂天"}])
>>> db.commit()

刪除:

>>> cur.execute('delete from t_emp a where a.empid in (3,4,5,6)')
>>> db.commit()

5. 關閉遊標
sql語句執行結束,再也不使用時,應關閉遊標,關閉遊標的語句爲:

cur.close()

6. 關閉數據庫
數據庫操做結束後應及時釋放鏈接,關閉數據庫鏈接的語句爲:

db.close()

7. 我寫的一個Oracle數據庫操做類
cx_Oracle是Python的Oracle操做的模塊,在使用時導入就能使用,可是由於數據庫使用時涉及鏈接、操做、提交、關閉鏈接等一系列操做,不可能每次使用時都把這些操做用代碼寫一遍,因此我把這些操做放到一個類裏,在實際使用時來調用這個類就好了。

複製代碼
#coding=utf-8
import cx_Oracle
class OpOracle():
    def __init__(self,ora_username,ora_password,ora_host,ora_port,ora_sid):
        '''初始化Oracle鏈接'''
        self.db=cx_Oracle.connect(ora_username,ora_password,ora_host+':'+ora_port+'/'+ora_sid)
        self.cur=self.db.cursor()
    def Ora_Select(self,strSql):
        '''執行strSql語句進行查詢'''
        self.cur.execute(strSql)
        return self.cur.fetchall()
    def Ora_IUD_Single(self,strSql):
        '''執行strSql語句進行增長、刪除、修改操做'''
        self.cur.execute(strSql)
        self.db.commit()
    def Ora_IUD_Multi(self,strSql,List):
        '''執行strSql語句進行增長、刪除、修改操做,對應參數使用List中的數據'''
        self.cur.prepare(strSql)
        self.cur.executemany(None,List)
        self.db.commit()
    def Ora_Cur_Close(self):
        '''關閉遊標'''
        self.cur.close()
    def Ora_db_Close(self):
        '''關閉Oracle數據庫鏈接'''
        self.db.close()
複製代碼

 

我把這段代碼保存在OpOracle.py文件中,使用時直接導入這個文件便可。如:

from OpOracle import OpOracle
ora=OpOracle('cs','ceshi','192.168.1.226','1521','db_emp')
l_emp=ora.Ora_Select('select * from t_emp')    #查詢t_emp表的數據並保存到l_emp列表中
ora.Ora_IUD_Single('delete from t_emp a where a.empid=1')  #刪除empid爲1的記錄
ora.Ora_Cur_Close()
ora.Ora_db_Close()     #最後記得關閉遊標和數據庫鏈接
相關文章
相關標籤/搜索