當前位置:首頁 » 數據倉庫 » python連接oracle資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

python連接oracle資料庫

發布時間: 2022-12-21 09:12:15

『壹』 python3.6 cx_oracle連接資料庫報編碼錯UnicodeDecodeError

我說下我遇到的情況

資料庫字元集是 ZHS16GBK

錯誤的情況是

UnicodeDecodeError:'gbk'codeccan'tdecodebyte0xa7inposition12:illegalmultibytesequence

經過檢查,在fetchall()獲取記錄時,查詢到的記錄裡面有亂碼(應該是不包含在資料庫現有字元集下的字元)

臨時的一個解決辦法是

db=cx_Oracle.connect(dblink,encoding='UTF-8')

這樣可以讀取了,讀取到的內容為

廣州市ue738同泰路

其中 'ue738'應該是之前不可被讀取的字元,希望對各位有幫助

『貳』 python用管理員身份連接oracle資料庫時報錯:

給你一個連接Oracle的公共庫:

#-*-coding:utf-8-*-
#!/usr/bin/envpython
'''
Createdon2014年8月4日

@author:188007

連接Oracle資料庫的class
'''
importos
os.environ['NLS_LANG']='SIMPLIFIEDCHINESE_CHINA.ZHS16GBK'
importcx_Oracle
importsys

classOracle:
'''

'''

def__init__(self,ip,port,db,user,pwd):
self.ip=ip
self.port=port
self.db=db
self.user=user
self.pwd=pwd

def__GetConnect(self):
"""得到連接信息返回:conn.cursor()"""
ifnotself.db:
raise(NameError,"沒有設置資料庫信息")
dsn=cx_Oracle.makedsn(self.ip,self.port,self.db)
self.conn=cx_Oracle.connect(self.user,self.pwd,dsn)
cur=self.conn.cursor()
ifnotcur:
raise(NameError,"連接資料庫失敗")
else:
returncur

defExecQuery(self,sql):
"""執行查詢語句返回的是一個包含tuple的list,list的元素是記錄行,tuple的元素是每行記錄的欄位
調用示例:
oracle=Oracle('10.27.95.253','1561','GFDMS','GFITAPPS','GFITAPPS')
resList=oracle.ExecQuery("SELECTOBJID,NUMCODE,AREACODE,AREANAME,PROVCODE,PROVNAME,CITYCODE,CITYNAME,TOWNCODE,TOWNNAME,REMARKFROMGFDMS.THZONEORDERBYNUMCODE")
for(AREANAME)inresList:
printstr(AREANAME).decode('gb2312')
"""
try:
cur=self.__GetConnect()
cur.execute(sql)
resList=cur.fetchall()

#查詢完畢後必須關閉連接
self.conn.close()
exceptException,err:
sys.exit(1)

returnresList

defExecNonQuery(self,sql):
"""執行非查詢語句
調用示例:
oracle.ExecNonQuery("insertintoTHZONEvalues('x','y')")
"""
try:
cur=self.__GetConnect()
cur.execute(sql)
self.conn.commit()
self.conn.close()
exceptException,err:
sys.exit(1)

#defmain():
##oracle=Oracle('10.27.95.253','1561','GFDMS','GFITAPPS','GFITAPPS')
###返回的是一個包含tuple的list,list的元素是記錄行,tuple的元素是每行記錄的欄位
##oracle.ExecNonQuery("insertintoTHZONEvalues('x','y')")
#oracle=Oracle('10.27.95.253','1561','GTEST','GTAPPS','GTAPPS')
#resList=oracle.ExecQuery("SELECTOBJID,NUMCODE,AREACODE,AREANAME,PROVCODE,PROVNAME,CITYCODE,CITYNAME,TOWNCODE,TOWNNAME,REMARKFROMGTEST.THZONEORDERBYNUMCODE")
#for(AREANAME)inresList:
#printstr(AREANAME).decode('utf-8')
#
#if__name__=='__main__':
#main()

『叄』 python3連接oracle報錯

python3連接oracle報錯
# -*- coding:utf-8 -*-
#!/usr/bin/env python
'''
Created on 2014年8月4日

@author: 188007

連接Oracle資料庫的class
'''
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
import cx_Oracle
import sys

class Oracle:
'''
python access oracle helper tool class
'''

def __init__(self, ip,port,db,user,pwd):
self.ip = ip
self.port = port
self.db = db
self.user = user
self.pwd = pwd

def __GetConnect(self):
""" 得到連接信息 返回: conn.cursor() """
if not self.db:
raise(NameError,"沒有設置資料庫信息")
dsn=cx_Oracle.makedsn(self.ip,self.port,self.db)
self.conn=cx_Oracle.connect(self.user,self.pwd,dsn)
cur = self.conn.cursor()
if not cur:
raise(NameError,"連接資料庫失敗")
else:
return cur

def ExecQuery(self,sql):
""" 執行查詢語句 返回的是一個包含tuple的list,list的元素是記錄行,tuple的元素是每行記錄的欄位
調用示例:
oracle = Oracle('10.27.95.253','1561','GFDMS','GFITAPPS','GFITAPPS')
resList = oracle.ExecQuery("SELECT OBJID,NUMCODE,AREACODE,AREANAME,PROVCODE,PROVNAME,CITYCODE,CITYNAME,TOWNCODE,TOWNNAME,REMARK FROM GFDMS.THZONE ORDER BY NUMCODE")
for (AREANAME) in resList:
print str(AREANAME).decode('gb2312')
"""
try:
cur = self.__GetConnect()
cur.execute(sql)
resList = cur.fetchall()

#查詢完畢後必須關閉連接
self.conn.close()
except Exception, err:
sys.exit(1)

return resList

def ExecNonQuery(self,sql):
""" 執行非查詢語句
調用示例:
oracle.ExecNonQuery("insert into THZONE values('x','y')")
"""
try:
cur = self.__GetConnect()
cur.execute(sql)
self.conn.commit()
self.conn.close()
except Exception, err:
sys.exit(1)

# def main():
# # oracle = Oracle('10.27.95.253','1561','GFDMS','GFITAPPS','GFITAPPS')
# # #返回的是一個包含tuple的list,list的元素是記錄行,tuple的元素是每行記錄的欄位
# # oracle.ExecNonQuery("insert into THZONE values('x','y')")
# oracle = Oracle('10.27.95.253','1561','GTEST','GTAPPS','GTAPPS')
# resList = oracle.ExecQuery("SELECT OBJID,NUMCODE,AREACODE,AREANAME,PROVCODE,PROVNAME,CITYCODE,CITYNAME,TOWNCODE,TOWNNAME,REMARK FROM GTEST.THZONE ORDER BY NUMCODE")
# for (AREANAME) in resList:
# print str(AREANAME).decode('utf-8')
#
# if __name__ == '__main__':
# main()

『肆』 python連接oracle資料庫報出 ORA-12541: TNS: 無監聽程序

方法一:
在oracle_home下找到lsnrctl.exe 輸入 start
方法二
可能認不到實例名
在cmd下運行
set oracle_sid=自己資料庫的實例名(大多數orcl)
網上還有很多解決辦法
也許不見得管用,這種問題具體問題具體分析比較好。介紹的這2種您的機器還不行。就去修改一個TNSNAMES.ORA。

『伍』 python連接oracle報錯代碼如下:

python連接oracle報錯代碼如下:
連接Oracle資料庫的class
'''
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
import cx_Oracle
import sys

class Oracle:
'''
python access oracle helper tool class
'''

def __init__(self, ip,port,db,user,pwd):
self.ip = ip
self.port = port
self.db = db
self.user = user
self.pwd = pwd

def __GetConnect(self):
""" 得到連接信息 返回: conn.cursor() """
if not self.db:
raise(NameError,"沒有設置資料庫信息")
dsn=cx_Oracle.makedsn(self.ip,self.port,self.db)
self.conn=cx_Oracle.connect(self.user,self.pwd,dsn)
cur = self.conn.cursor()
if not cur:
raise(NameError,"連接資料庫失敗")
else:
return cur

『陸』 python使用Cx_Oracle 連接資料庫報錯

# -*- coding:utf-8 -*-#!/usr/bin/env python'''Created on 2014年8月4日 @author: 188007 連接Oracle資料庫的class'''import osos.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'import cx_Oracleimport sys class Oracle: ''' python access oracle helper tool class ''' def __init__(self, ip,port,db,user,pwd): self.ip = ip self.port = port self.db = db self.user = user self.pwd = pwd def __GetConnect(self): """ 得到連接信息 返回: conn.cursor() """ if not self.db: raise(NameError,"沒有設置資料庫信息") dsn=cx_Oracle.makedsn(self.ip,self.port,self.db) self.conn=cx_Oracle.connect(self.user,self.pwd,dsn) cur = self.conn.cursor() if not cur: raise(NameError,"連接資料庫失敗") else: return cur def ExecQuery(self,sql): """ 執行查詢語句 返回的是一個包含tuple的list,list的元素是記錄行,tuple的元素是每行記錄的欄位 調用示例: oracle = Oracle('10.27.95.253','1561','GFDMS','GFITAPPS','GFITAPPS') resList = oracle.ExecQuery("SELECT OBJID,NUMCODE,AREACODE,AREANAME,PROVCODE,PROVNAME,CITYCODE,CITYNAME,TOWNCODE,TOWNNAME,REMARK FROM GFDMS.THZONE ORDER BY NUMCODE") for (AREANAME) in resList: print str(AREANAME).decode('gb2312') """ try: cur = self.__GetConnect() cur.execute(sql) resList = cur.fetchall() #查詢完畢後必須關閉連接 self.conn.close() except Exception, err: sys.exit(1) return resList def ExecNonQuery(self,sql): """ 執行非查詢語句 調用示例: oracle.ExecNonQuery("insert into THZONE values('x','y')") """ try: cur = self.__GetConnect() cur.execute(sql) self.conn.commit() self.conn.close() except Exception, err: sys.exit(1) # def main():# # oracle = Oracle('10.27.95.253','1561','GFDMS','GFITAPPS','GFITAPPS')# # #返回的是一個包含tuple的list,list的元素是記錄行,tuple的元素是每行記錄的欄位# # oracle.ExecNonQuery("insert into THZONE values('x','y')")# oracle = Oracle('10.27.95.253','1561','GTEST','GTAPPS','GTAPPS')# resList = oracle.ExecQuery("SELECT OBJID,NUMCODE,AREACODE,AREANAME,PROVCODE,PROVNAME,CITYCODE,CITYNAME,TOWNCODE,TOWNNAME,REMARK FROM GTEST.THZONE ORDER BY NUMCODE")# for (AREANAME) in resList:# print str(AREANAME).decode('utf-8')# # if __name__ == '__main__':# main()

『柒』 如何用python更新oracle資料庫

用python更新oracle資料庫:
1. 要想使Python可以操作Oracle資料庫,首先需要安裝cx_Oracle包,可以通過下面的地址來獲取安裝包:cx-oracle.sourceforge.net/
2. 另外還需要oracle的一些類庫,此時需要在運行python的機器上安裝Oracle Instant Client軟體包,可以通過下面地址獲得technetwork/database/features/instant-client/index-097480.html
找到符合自己平台的包,然後安裝,這里我使用的是rpm包,所以使用以下命令安裝
$ sudo rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.i386.rpm
裝完畢後還需要設置一下環境變數,如下
$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/lib/oracle/11.2/client/lib
然後寫update語句對表進行更新:
import cx_Oracle //導入鏈接oracle的庫
conn = cx_Oracle.connect('fkong/[email protected]/orcl') //建立與orcl的連接
cursor = conn.cursor () //打開游標
cursor.execute ("update test set COL1='u' where ID=1") //執行更新
conn.commit() //提交結果
cursor.close (); //關閉游標
conn.close ();//關閉連接

『捌』 python打包以後不能連接orcle資料庫怎麼辦

應該是少了某些文件
前言

Python自帶的模塊中有很多操縱文件的。我們可以把文件的數據讀出來,經過處理還可以將數據寫入文件中。但是對於數據的管理和分析來說,資料庫還是專業一些。如果Python能和資料庫結合在一起,那麼就能結合兩種的優勢,提高效率。

工作中使用的是Oracle資料庫,Python有一個模塊cx_Oracle可以與Oracle相連。要使用cx_Oracle,就要先下載。

1. 下載cx_Oracle

Python一個官方網站PyPI,上面有豐富的模塊。cx_Oracle就可以在PyPI中下載。打開PyPI的,在裡面搜索cx_Oracle,即可找到該模塊。當然也可以通過其它的途徑下載。

下載之後就可以使用了。

2. 使用流程

簡單的使用流程如下:

1.引用模塊cx_Oracle
2.連接資料庫
3.獲取cursor
4.使用cursor進行各種操作
5.關閉cursor
6.關閉連接

下面是一個簡單的例子:

import cx_Oracle #引用模塊cx_Oracle
conn=cx_Oracle.connect('load/123456@localhost/ora11g') #連接資料庫
c=conn.cursor() #獲取cursor
x=c.execute('select sysdate from al') #使用cursor進行各種操作
x.fetchone()
c.close() #關閉cursor
conn.close() #關閉連接

3. 幾種用法

Python對資料庫的操作主要有2方面:一個是寫數據,一個是讀數據。這2個方面的實現可以通過SQL語句實現,也可以通過存儲過程實現。所以cx_Oracle的主要用法有:

1. 執行SQL語句

2. 調用存儲過程和函數。

4. 執行SQL語句

執行SQL語句很簡單,從上面的例子就可以看出。使用cursor.execute即可執行。使用fetchone或fetchall即可將執行結果讀出來。

下面一個例子是Insert語句,使用的變數綁定。

import cx_Oracle
conn=cx_Oracle.connect('load/123456@loaclhost/ora11g')
c=conn.cursor()
x=c.execute('insert into demo(v) values(:1)',['nice'])
conn.commit();
c.close()
conn.close()

變數綁定和Oracle的動態SQL一樣,都是冒號將佔位符,即代碼中的:1,對變數的復制就是傳入一個List,即代碼中的['nice']。有多少個變數,list中就應該對應多少個值,數目要一致,否則會報錯。

執行之後,可以使用連接的一個方法connect.commit(),將事務提交。

5. 調用存儲過程和方法

直接上代碼:

--存儲過程代碼:
CREATE OR REPLACE PROCEDURE P_DEMO(V1 IN VARCHAR2, V2 OUT VARCHAR2) IS
BEGIN
V2 := V1;
END;

#Python代碼:
import cx_Oracle
conn=cx_Oracle.connect('load/123456@localhost/ora11g')
c=conn.cursor()
str1='nice'
str2=' '#需要有值,即len(str2)>=len(str1)
x=c.callproc('p_demo',[str1,str2])
print(str2)
c.close()
conn.close()

調用存儲過程使用的是cursor.callproc方法。上面的存儲過程中,一個變數的值是OUT型的,在Python中,對OUT型的變數賦值,主要該變數的長度不能小於存儲過程中的。

--函數代碼:
CREATE OR REPLACE function F_DEMO(V1 VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN V1;
END;

#Python代碼:
import cx_Oracle
conn=cx_Oracle.connect('load/123456@localhost/ora11g')
c=conn.cursor()
str1='nice'
str2=c.callfunc('f_demo',cx_Oracle.STRING,[str1])
print(str2)
c.close()
conn.close()

調用函數使用的方法是cursor.callfunc。這個與調用存儲過程不同之處在於,它需要指定傳輸參數的類型。

結束

通過cx_Oracle,可以是Python與Oracle資料庫相互溝通,這樣兩者就可以長處互補。

比如,可以將Python當成一個數據收集的工具,可以從Web,從文件中獲取數據,然後將這些數據保存到Oracle資料庫中,在Oracle資料庫上進行數據的進一步分析。

『玖』 python自定義輸入用戶名和密碼如何寫到oracl資料庫中

有很多小夥伴可能知道python不知道怎麼讓用戶名和密碼寫到oracle數據中。接下來就讓小編給大家解釋說明一下操作方法
1.保證與oracle伺服器版本統一。這是想要數據傳送的首要必要的條件。
2.然後我們再找到python3 ,oracle伺服器,oracle client統一使用64位或者32位。這里小編推薦大家使用64位以上的系統,因為64位以上的系統操作簡單,比較穩定。
2.先解壓縮instantclient-basic-linux.x64-11.2.0.4.0.zip,最後後解壓縮instantclient-sdk-linux.x64-11.2.0.4.0.zip注意在這里解壓的時候一定要解壓到我們可以找到的地方。
3.進入目錄instantclient_11_2,創建軟鏈接ln -s libclntsh.so.11.1 libclntsh.so4.在剛剛解壓得到的instantclient_11_2文件夾下新建network/admin
5.在剛剛創建的目錄下創建network/admin創建文件tnsnames.ora,最後按照以下的模板進行調整就能得到一個完整的程序。模板如下(SERVICE_NAME請填寫伺服器SID)以上就是 Python寫入到oracl資料庫中的幾個步驟,如果說對你有幫助,那麼就點贊轉發吧!

『拾』 Python 進行 Oracle 與 Mysql 不同資料庫類型之間的數據 diff


項目工作中,可能會有 A 類型資料庫數據需要遷移到 B 類型的資料庫中的需求。 例如:假設現有一個資料庫的遷移需求,是將 Oracle 資料庫里的數據遷移至 Mysql 資料庫中。 常規的測試方法是人工去抽樣檢測數據進行 diff,因為數據量太大,人工不可能實現全量數據的肉眼 diff。

因此,為提高數據 diff 的正確性以及測試效率,編寫測試腳本進行全量遷移數據的 diff 是十分必要的。以下內容將會著重講解如何使用 Python 編寫腳本來實現 Oracle 與 Mysql 這種不同類型資料庫之間數據的 diff。


1、連接oracle資料庫並獲取要提取的數據,並輸出列表裡面嵌入的字典類型的數據

2、連接mysql資料庫並獲取要提取的數據,並輸出列表裡面嵌入的字典類型的數據

3、Oracle 與 Mysql 資料庫進行 diff,直接調用上面兩個方法即可

4、執行後的輸出結果