日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python -- 連接 orclae cx_Oracle的使用 二

系統(tǒng) 1789 0

轉(zhuǎn):https://www.cnblogs.com/cyxiaer/p/9396861.html

?

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

只連接數(shù)據(jù)庫的話不必安裝客戶端:

1. 把cx_Oracle的客戶端文件復制到site-packages/ 目錄下,可能是Python, Anaconda, venv下面的安裝包里

2. 把下載的instantclient文件夾下的.dll文件全部復制到site-packages/ 目錄下

3. 把instantclient文件解壓后的地址添加到環(huán)境變量里面去。

4. 創(chuàng)建數(shù)據(jù)庫連接.

創(chuàng)建數(shù)據(jù)庫連接connect和關閉數(shù)據(jù)庫連接close

創(chuàng)建數(shù)據(jù)庫連接的三種方式:

方法一:用戶名、密碼和監(jiān)聽分開寫

import cx_Oracle

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

db.close()

?

方法二:用戶名、密碼和監(jiān)聽寫在一起

import cx_Oracle

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

db.close()

?

方法三:配置監(jiān)聽并連接

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

錯誤表現(xiàn):
cx_Oracle連接Oracle數(shù)據(jù)庫的時候報錯:
cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle

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

SQLAlchemy Oracle 的中文問題

你需要設置? NLS_LANG ?環(huán)境變量,否則你讀取出來的中文可能是亂碼,或者當 insert 的數(shù)據(jù)有中文時會導致 Unicode 編碼錯誤。

你可以在 Python 代碼中這么設置環(huán)境變量

          
            
              
                # 設置編碼,否則:

                
                  
                    # 1. Oracle 查詢出來的中文是亂碼

                    
                      
                        # 2. 插入數(shù)據(jù)時有中文,會導致 
                        
                          
                            # 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編碼去解析我們的網(wǎng)絡數(shù)據(jù)流txt,然而txt此時已經(jīng)是decode過的unicode編碼,這樣的話就會導致解析不了,出現(xiàn)上述問題。 解決的辦法就是,改變目標文件的編碼:

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

1. cx_Oracle
cx_Oracle模塊是Python連接Oracle數(shù)據(jù)庫的模塊,在Python中,如果要連接Oracle,必須先安裝cx_Oracle模塊。?
cx_Oracle的下載地址:https://pypi.python.org/pypi/cx_Oracle/?
選擇和操作系統(tǒng)、Python版本一致的安裝包進行安裝。當然為了省事兒,你也可以直接使用pip命令來安裝cx_Oracle。

pip install cx_Oracle

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

2. 連接Oracle數(shù)據(jù)庫
方法一:用戶名、密碼、監(jiān)聽分開寫

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


方法二:用戶名、密碼、監(jiān)聽寫一起

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

方法三:先配置監(jiān)聽,后連接

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

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

3. 創(chuàng)建游標
cx_Oracle中,對于數(shù)據(jù)庫的增刪改查操作需要通過游標來進行,游標的創(chuàng)建語句如下:

cur=db.cursor()

4. 執(zhí)行sql語句
Sql語句書寫:不需要從外部傳入?yún)?shù),可以直接書寫sql語句,然后使用execute執(zhí)行sql即可;如果需要從外部傳入?yún)?shù),在需要傳入?yún)?shù)的地方使用變量,并在變量前加“:”,然后通過prepare加載sql語句。

cur.prepare:如果執(zhí)行的sql語句需要傳外部參數(shù),可以先用這個函數(shù)加載sql語句,然后再通過execute或executemany加參數(shù)執(zhí)行。
cur.execute:執(zhí)行單條sql語句。
cur.executemany:執(zhí)行多條sql語句。
關于execute需要說明的是如果執(zhí)行的sql語句不需要從外部傳入?yún)?shù),那么可以跳過prepare,直接將sql語句作為execute的第一個參數(shù)來執(zhí)行sql。

db.commit():執(zhí)行提交操作,增、刪、改后需要使用。
cur.fetchall:在查詢之后使用,獲取所有查詢到的結(jié)果記錄。
cur.fetchone:在查詢之后使用,獲取一條查詢到的結(jié)果記錄。
關于fetchall和fetchone需要說明的是查詢到的記錄一旦被提取,就不能再次被提取,不管是用fetchall提取還是使用fetchone提取。

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

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

for result in cur: ?#循環(huán)從游標獲取每一行并輸出該行。
????print result
寫完游標可以去循環(huán)游標讓它輸出結(jié)果。
?

查詢:?
需要外部參數(shù):

>>> cur.prepare('select * from t_emp a where a.empid=:id')
>>> cur.execute(None,{'id':id})
>
>>> cur.fetchall()

不需要外部參數(shù):

>>> cur.execute("select e.empid,e.empname from t_emp e")
>
>>> 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語句執(zhí)行結(jié)束,不再使用時,應關閉游標,關閉游標的語句為:

cur.close()

6. 關閉數(shù)據(jù)庫
數(shù)據(jù)庫操作結(jié)束后應及時釋放連接,關閉數(shù)據(jù)庫連接的語句為:

db.close()

7. 我寫的一個Oracle數(shù)據(jù)庫操作類
cx_Oracle是Python的Oracle操作的模塊,在使用時導入就能使用,但是因為數(shù)據(jù)庫使用時涉及連接、操作、提交、關閉連接等一系列操作,不可能每次使用時都把這些操作用代碼寫一遍,所以我把這些操作放到一個類里,在實際使用時來調(diào)用這個類就行了。

復制代碼
            #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):
        '''執(zhí)行strSql語句進行查詢'''
        self.cur.execute(strSql)
        return self.cur.fetchall()
    def Ora_IUD_Single(self,strSql):
        '''執(zhí)行strSql語句進行增加、刪除、修改操作'''
        self.cur.execute(strSql)
        self.db.commit()
    def Ora_IUD_Multi(self,strSql,List):
        '''執(zhí)行strSql語句進行增加、刪除、修改操作,對應參數(shù)使用List中的數(shù)據(jù)'''
        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數(shù)據(jù)庫連接'''
        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表的數(shù)據(jù)并保存到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()     #最后記得關閉游標和數(shù)據(jù)庫連接
            


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 武功县| 冷水江市| 平顺县| 涞水县| 贺兰县| 台江县| 北辰区| 广州市| 和平县| 彰化市| 体育| 姜堰市| 道孚县| 垣曲县| 当阳市| 富源县| 尖扎县| 黄龙县| 马尔康县| 天柱县| 板桥市| 彰武县| 江城| 玉环县| 家居| 额尔古纳市| 太原市| 宝坻区| 晋宁县| 鄂州市| 兴宁市| 隆德县| 体育| 宜州市| 商都县| 玛多县| 临桂县| 临城县| 天柱县| 如东县| 大足县|