python操作oracle的完整教程分享
1. 連接對(duì)象
操作數(shù)據(jù)庫(kù)之前,首先要建立數(shù)據(jù)庫(kù)連接。
有下面幾個(gè)方法進(jìn)行連接。
>>>import cx_Oracle
>>>db = cx_Oracle.connect('hr', 'hrpwd', 'localhost:1521/XE')
>>>db1 = cx_Oracle.connect('hr/hrpwd@localhost:1521/XE')
>>>dsn_tns = cx_Oracle.makedsn('localhost', 1521, 'XE')
>>>print dsn_tns
>>>print db.version
10.2.0.1.0
>>> versioning = db.version.split('.')
>>> print versioning
['10', '2', '0', '1', '0']
>>> if versioning[0]=='10':
... print "Running 10g"
... elif versioning[0]=='9':
... print "Running 9i"
...
Running 10g
>>> print db.dsn
localhost:1521/XE
2. cursor對(duì)象
使用數(shù)據(jù)庫(kù)連接對(duì)象的cursor()方法,你可以定義任意數(shù)量的cursor對(duì)象,簡(jiǎn)單的程序可能使用一個(gè)cursor,并重復(fù)使用了,但大型項(xiàng)目會(huì)使用多個(gè)不同的cursor。
>>>cursor= db.cursor()
應(yīng)用程序邏輯通常需要清楚的區(qū)分處理數(shù)據(jù)操作的每個(gè)階段。這將幫助更好的理解性能瓶頸和代碼優(yōu)化。
這些步驟有:
parse(optional)
無(wú)需調(diào)用該方法,因?yàn)閳?zhí)行階段會(huì)自動(dòng)先執(zhí)行,用于檢查sql語(yǔ)句是否正確,當(dāng)有錯(cuò)誤時(shí),拋出DatabaseError異常及相應(yīng)的錯(cuò)誤信息。如:‘'ORA-00900:invalid SQL statement.“。
Execute cx_Oracle.Cursor.execute( statement,[parameters], **keyword_parameters)
該方法能接收單個(gè)參數(shù)SQL,直接操作數(shù)據(jù)庫(kù),也可以通過(guò)綁定變量執(zhí)行動(dòng)態(tài)SQL,parames或keyworparameters可以是字典、序列或一組關(guān)鍵字參數(shù)。
cx_Oracle.Cursor.executemany(statement,parameters)
特別有用的批量插入,避免一次只能插入一條;
Fetch(optional)
僅用于查詢(xún),因?yàn)镈DL和DCL語(yǔ)句沒(méi)有返回結(jié)果。如果cursor沒(méi)有執(zhí)行查詢(xún),會(huì)拋出InterfaceError異常。
cx_Oracle.Cursor.fetchall()
獲取所有結(jié)果集,返回元祖列表,如果沒(méi)有有效行,返回空列表。
cx_Oracle.Cursor.fetchmany([rows_no])
從數(shù)據(jù)庫(kù)中取下一個(gè)rows_no數(shù)據(jù)
cx_Oracle.Cursor.fetchone()
從數(shù)據(jù)庫(kù)中取單個(gè)元祖,如果沒(méi)有有效數(shù)據(jù)返回none。
3. 綁定變量
綁定變量查詢(xún)可以提高效率,避免不必要的編譯;參數(shù)可以是名稱(chēng)參數(shù)或位置參數(shù),盡量使用名稱(chēng)綁定。
>>>named_params = {'dept_id':50, 'sal':1000}
>>>query1 = cursor.execute('SELECT * FROM employees WHERE department_id=:dept_idAND salary>:sal', named_params)
>>> query2 = cursor.execute('SELECT * FROM employees WHERE department_id=:dept_idAND salary>:sal', dept_id=50, sal=1000)
Whenusing named bind variables you can check the currently assigned ones using thebindnames() method of the cursor:
>>> printcursor.bindnames()
['DEPT_ID', 'SAL']
4. 批量插入
大量插入插入操作,可以使用python的批量插入功能,無(wú)需多次單獨(dú)調(diào)用insert,這樣可以提升性能。參考后面示例代碼。
5. 示例代碼
'''
Created on 2016年7月7日
@author: Tommy
'''
import cx_Oracle
class Oracle(object):
""" oracle db operator """
def __init__(self,userName,password,host,instance):
self._conn = cx_Oracle.connect("%s/%s@%s/%s" % (userName,password,host,instance))
self.cursor = self._conn.cursor()
def queryTitle(self,sql,nameParams={}):
if len(nameParams) > 0 :
self.cursor.execute(sql,nameParams)
else:
self.cursor.execute(sql)
colNames = []
for i in range(0,len(self.cursor.description)):
colNames.append(self.cursor.description[i][0])
return colNames
# query methods
def queryAll(self,sql):
self.cursor.execute(sql)
return self.cursor.fetchall()
def queryOne(self,sql):
self.cursor.execute(sql)
return self.cursor.fetchone()
def queryBy(self,sql,nameParams={}):
if len(nameParams) > 0 :
self.cursor.execute(sql,nameParams)
else:
self.cursor.execute(sql)
return self.cursor.fetchall()
def insertBatch(self,sql,nameParams=[]):
"""batch insert much rows one time,use location parameter"""
self.cursor.prepare(sql)
self.cursor.executemany(None, nameParams)
self.commit()
def commit(self):
self._conn.commit()
def __del__(self):
if hasattr(self,'cursor'):
self.cursor.close()
if hasattr(self,'_conn'):
self._conn.close()
def test1():
# sql = """select user_name,user_real_name,to_char(create_date,'yyyy-mm-dd') create_date from sys_user where id = '10000' """
sql = """select user_name,user_real_name,to_char(create_date,'yyyy-mm-dd') create_date from sys_user where id =: id """
oraDb = Oracle('test','java','192.168.0.192','orcl')
fields = oraDb.queryTitle(sql, {'id':'10000'})
print(fields)
print(oraDb.queryBy(sql, {'id':'10000'}))
def test2():
oraDb = Oracle('test','java','192.168.0.192','orcl')
cursor = oraDb.cursor
create_table = """
CREATE TABLE python_modules (
module_name VARCHAR2(50) NOT NULL,
file_path VARCHAR2(300) NOT NULL
)
"""
from sys import modules
cursor.execute(create_table)
M = []
for m_name, m_info in modules.items():
try:
M.append((m_name, m_info.__file__))
except AttributeError:
pass
sql = "INSERT INTO python_modules(module_name, file_path) VALUES (:1, :2)"
oraDb.insertBatch(sql,M)
cursor.execute("SELECT COUNT(*) FROM python_modules")
print(cursor.fetchone())
print('insert batch ok.')
cursor.execute("DROP TABLE python_modules PURGE")
test2()
以上這篇python操作oracle的完整教程分享就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python實(shí)現(xiàn)自動(dòng)化報(bào)表功能(Oracle/plsql/Excel/多線程)
- python使用 cx_Oracle 模塊進(jìn)行查詢(xún)操作示例
- 使用Python腳本zabbix自定義key監(jiān)控oracle連接狀態(tài)
- Python如何應(yīng)用cx_Oracle獲取oracle中的clob字段問(wèn)題
- 解決python通過(guò)cx_Oracle模塊連接Oracle亂碼的問(wèn)題
- 解決python3捕獲cx_oracle拋出的異常錯(cuò)誤問(wèn)題
- Python3連接SQLServer、Oracle、MySql的方法
- Python3.6連接Oracle數(shù)據(jù)庫(kù)的方法詳解
- Python讀寫(xiě)及備份oracle數(shù)據(jù)庫(kù)操作示例
- Python操作Oracle數(shù)據(jù)庫(kù)的簡(jiǎn)單方法和封裝類(lèi)實(shí)例
- Python使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫(kù)詳解
- python鏈接oracle數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)的增刪改查實(shí)例
- python cx_Oracle的基礎(chǔ)使用方法(連接和增刪改查)
- Python使用cx_Oracle調(diào)用Oracle存儲(chǔ)過(guò)程的方法示例
- Python編程實(shí)戰(zhàn)之Oracle數(shù)據(jù)庫(kù)操作示例
- windows下python連接oracle數(shù)據(jù)庫(kù)
- python安裝oracle擴(kuò)展及數(shù)據(jù)庫(kù)連接方法
- Python連接Oracle之環(huán)境配置、實(shí)例代碼及報(bào)錯(cuò)解決方法詳解
相關(guān)文章
python基于OpenCV模塊實(shí)現(xiàn)視頻流數(shù)據(jù)切割為圖像幀數(shù)據(jù)(流程分析)
這篇文章主要介紹了python基于OpenCV模塊實(shí)現(xiàn)視頻流數(shù)據(jù)切割為圖像幀數(shù)據(jù),這里今天主要是實(shí)踐一下視頻流數(shù)據(jù)的預(yù)處理工作,需要的朋友可以參考下2022-05-05
Python數(shù)據(jù)結(jié)構(gòu)鏈表操作從基礎(chǔ)到高級(jí)實(shí)例深究
鏈表是一種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),它由一系列節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)都包含數(shù)據(jù)和指向下一個(gè)節(jié)點(diǎn)的引用,在Python中,可以使用類(lèi)來(lái)實(shí)現(xiàn)鏈表,本文將介紹如何實(shí)現(xiàn)鏈表,并提供一些豐富的示例代碼來(lái)幫助你更好地理解其原理和應(yīng)用2023-12-12
Python+Appium實(shí)現(xiàn)自動(dòng)化測(cè)試的使用步驟
這篇文章主要介紹了Python+Appium實(shí)現(xiàn)自動(dòng)化測(cè)試的使用步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
pycharm 實(shí)現(xiàn)光標(biāo)快速移動(dòng)到括號(hào)外或行尾的操作
這篇文章主要介紹了pycharm 實(shí)現(xiàn)光標(biāo)快速移動(dòng)到括號(hào)外或行尾的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Python的Tkinter點(diǎn)擊按鈕觸發(fā)事件的例子
今天小編就為大家分享一篇Python的Tkinter點(diǎn)擊按鈕觸發(fā)事件的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Python虛擬機(jī)中描述器的王炸應(yīng)用分享
本篇文章給大家介紹一下描述器在?python?語(yǔ)言當(dāng)中有哪些應(yīng)用,主要介紹如何使用?python?語(yǔ)言實(shí)現(xiàn)?python?內(nèi)置的?proterty?、staticmethod?和?class?method,需要的可以參考一下2023-05-05
python腳本監(jiān)控Tomcat服務(wù)器的方法
這篇文章主要介紹了利用python腳本監(jiān)控Tomcat服務(wù)器的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
python實(shí)現(xiàn)圖片數(shù)據(jù)增強(qiáng)的示例詳解
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片數(shù)據(jù)增強(qiáng)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下2023-10-10
OpenCV python sklearn隨機(jī)超參數(shù)搜索的實(shí)現(xiàn)
這篇文章主要介紹了OpenCV python sklearn隨機(jī)超參數(shù)搜索的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

