python cx_Oracle的基礎(chǔ)使用方法(連接和增刪改查)
問(wèn)題
使用python操作oracle數(shù)據(jù)庫(kù),獲取表的某幾個(gè)字段作為變量值使用。
使用Popen+sqlplus的方法需要對(duì)格式進(jìn)行控制,通過(guò)流獲取這幾個(gè)字段值不簡(jiǎn)潔(個(gè)人觀點(diǎn)……)。(優(yōu)點(diǎn)是能夠使用sqlplus的方法直接訪問(wèn)sql文件,不需要考慮打開(kāi)/關(guān)閉連接,并且通過(guò)流向文件中寫(xiě)入還挺好用的。不過(guò)優(yōu)點(diǎn)不是這次所關(guān)注的)
使用cx-Oracle將查詢結(jié)果返回為tuple格式,對(duì)返回結(jié)果的操作簡(jiǎn)潔,滿足需求。(要注意數(shù)據(jù)庫(kù)連接創(chuàng)建與關(guān)閉、sql的編寫(xiě)、預(yù)處理與提交等等,看起來(lái)也不簡(jiǎn)潔(同樣個(gè)人觀點(diǎn)……))
基礎(chǔ)方法
數(shù)據(jù)庫(kù)連接
1、使用tns串連接
oracle_tns = cx_Oracle.makedsn('XXX.XXX.XXX.XXX', 1521,'oracleName')
connectObj = cx_Oracle.connect('oracleUserName', 'password', oracle_tns)
2、其他簡(jiǎn)潔方式
db = cx_Oracle.connect('hr', 'hrpwd', 'localhost:1521/XE')
db1 = cx_Oracle.connect('hr/hrpwd@localhost:1521/XE')
數(shù)據(jù)庫(kù)斷開(kāi)連接
connectObj.close()
建立游標(biāo)
cursorObj = connectObj.cursor()
關(guān)閉游標(biāo)
cursorObj.close()
增
1、單條插入:
sql = "INSERT INTO T_AUTOMONITOR_TMP(point_id) VALUES(:pointId)"
cursorObj.prepare(sql)
rown = cursorObj.execute(None, {'pointId' : pointId})
connectObj.commit()
2、多條插入:
sql = "INSERT INTO T_AUTOMONITOR_TMP(point_id) VALUES(:pointId)" cursorObj.prepare(sql) rown = cursorObj.executemany(None, recordList) connectObj.commit()
刪
sql = "DELETE FROM T_AUTOMONITOR_TMP t WHERE t.point_id = :pointId "
cursorObj.prepare(sql)
rown = cursorObj.execute(None, {'pointId' : pointId})
connectObj.commit()
改
sql = "UPDATE t_automonitor_other t\
SET t.active = '2'\
WHERE t.active = '1'\
AND t.point_id = :pointId\
"
cursorObj.prepare(sql)
cursorObj.execute(None, {'pointId' : pointId})
connectObj.commit()
查
sql = "SELECT t.describ FROM t_automonitor_tmp t WHERE t.point_id = :pointId"
cursorObj.prepare(sql)
cursorObj.execute(None, {'pointId' : pointId})
Tips
- 增、刪、改操作都需要當(dāng)前連接進(jìn)行commit()
- 若使用一個(gè)游標(biāo)cursor進(jìn)行N次查詢,注意若再使用前N-1次查詢結(jié)果可能會(huì)存在異常。要進(jìn)行多個(gè)查詢,個(gè)人建議使用完cursor后將結(jié)果保留再關(guān)閉cursor,多次查詢重復(fù)該操作。
- 如果不使用prepare,可以直接使用execute,以下查詢等價(jià):
r1 = cursor.execute('SELECT * FROM locations WHERE country_id=:1 AND city=:2', ('US', 'Seattle'))
r2 = cursor.execute('SELECT * FROM locations WHERE country_id=:9 AND city=:4', ('US', 'Seattle'))
r3 = cursor.execute('SELECT * FROM locations WHERE country_id=:m AND city=:0', ('US', 'Seattle'))
- sql語(yǔ)句的語(yǔ)法與數(shù)據(jù)庫(kù)有關(guān),不想使用綁定變量,可以拼接sql字符串 (´•༝•`)
簡(jiǎn)單工具
class baseUtilsX():
"""baseUtils"""
def __init__(self):
self.connectObj = ""
self.connCnt = 0
self.cursorCnt = 0
def initOracleConnect(self):
oracle_tns = cx_Oracle.makedsn('XXX.XXX.XXX.XXX', 1521,'XX')
if self.connCnt == 0:
self.connectObj = cx_Oracle.connect('oracleUserName', 'password', oracle_tns)
self.connCnt += 1
def getOracleConnect(self):
self.initOracleConnect()
return self.connectObj
def closeOracleConnect(self, connectObj):
connectObj.close()
self.connCnt -= 1
def getOracleCursor(self):
self.initOracleConnect()
self.cursorCnt += 1
return self.connectObj.cursor()
def closeOracleCursor(self, cursorObj):
cursorObj.close()
self.cursorCnt -= 1
if self.cursorCnt == 0:
print "will close conn"
self.closeOracleConnect(self.connectObj)
def selectFromDbTable(self, sql, argsDict):
# 將查詢結(jié)果由tuple轉(zhuǎn)為list
queryAnsList = []
selectCursor = self.getOracleCursor()
selectCursor.prepare(sql)
queryAns = selectCursor.execute(None, argsDict)
for ansItem in queryAns:
queryAnsList.append(list(ansItem))
self.closeOracleCursor(selectCursor)
return queryAnsList
python 連接 Oracle 亂碼問(wèn)題(cx_Oracle)
用python連接Oracle是總是亂碼,最后發(fā)現(xiàn)時(shí)oracle客戶端的字符編碼設(shè)置不對(duì)。
編寫(xiě)的python腳本中需要加入如下幾句:
import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
這樣可以保證select出來(lái)的中文顯示沒(méi)有問(wèn)題。
要能夠正常的insert和update中文,還需要指定python源文件的字符集密碼和oracle一致。
# -*- coding: utf-8 -*-
例子:
# -*- coding: utf-8 -*- import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' #或者os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8' import cx_Oracle db = cx_Oracle.connect(username/passwd@host:port/sevicename) cursor = db.cursor() #其他操作 db.commit() db.close()
參考:
客戶端的NLS_LANG設(shè)置及編碼轉(zhuǎn)換
①在Oracle客戶端向服務(wù)器端提交SQL語(yǔ)句時(shí),Oracle客戶端根據(jù)NLS_LANG和數(shù)據(jù)庫(kù)字符集,對(duì)從應(yīng)用程序接傳送過(guò)來(lái)的字符串編碼進(jìn)行轉(zhuǎn)換處理。如果NLS_LANG與數(shù)據(jù)庫(kù)字符集相同,不作轉(zhuǎn)換,否則要轉(zhuǎn)換成數(shù)據(jù)庫(kù)字符集并傳送到服務(wù)器。服務(wù)器在接收到字符串編碼之后,對(duì)于普通的CHAR或VARCHAR2類型,直接存儲(chǔ);對(duì)于NCHAR或NVARCHAR2類型,服務(wù)器端將其轉(zhuǎn)換為國(guó)家字符集再存儲(chǔ)。
①在Oracle客戶端向服務(wù)器端提交SQL語(yǔ)句時(shí),Oracle客戶端根據(jù)NLS_LANG和數(shù)據(jù)庫(kù)字符集,對(duì)從應(yīng)用程序接傳送過(guò)來(lái)的字符串編碼進(jìn)行轉(zhuǎn)換處理。如果NLS_LANG與數(shù)據(jù)庫(kù)字符集相同,不作轉(zhuǎn)換,否則要轉(zhuǎn)換成數(shù)據(jù)庫(kù)字符集并傳送到服務(wù)器。服務(wù)器在接收到字符串編碼之后,對(duì)于普通的CHAR或VARCHAR2類型,直接存儲(chǔ);對(duì)于NCHAR或NVARCHAR2類型,服務(wù)器端將其轉(zhuǎn)換為國(guó)家字符集再存儲(chǔ)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
參考文章
精通 Oracle+Python,第 1 部分:查詢最佳應(yīng)踐
- 配置python連接oracle讀取excel數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)的操作流程
- 解決python3.6用cx_Oracle庫(kù)連接Oracle的問(wèn)題
- 基于python連接oracle導(dǎo)并出數(shù)據(jù)文件
- Python連接Oracle之環(huán)境配置、實(shí)例代碼及報(bào)錯(cuò)解決方法詳解
- 使用Python腳本zabbix自定義key監(jiān)控oracle連接狀態(tài)
- 解決python通過(guò)cx_Oracle模塊連接Oracle亂碼的問(wèn)題
- Python3連接SQLServer、Oracle、MySql的方法
- Python3.6連接Oracle數(shù)據(jù)庫(kù)的方法詳解
- windows下python連接oracle數(shù)據(jù)庫(kù)
- python安裝oracle擴(kuò)展及數(shù)據(jù)庫(kù)連接方法
- python連接oracle數(shù)據(jù)庫(kù)實(shí)例
- 教你使用Python連接oracle
相關(guān)文章
python計(jì)算階乘的兩個(gè)函數(shù)用法
這篇文章主要介紹了python計(jì)算階乘的兩個(gè)函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
關(guān)于Python八大排序?qū)崿F(xiàn)方法(冒泡排序、快速排序等)
這篇文章主要介紹了關(guān)于Python八大排序?qū)崿F(xiàn)方法,主要有基數(shù)排序、歸并排序、堆排序、簡(jiǎn)單選擇排序、直接插入排序、希爾排序、快速排序、冒泡排序等,需要的朋友可以參考下2023-03-03
python實(shí)現(xiàn)selenium網(wǎng)絡(luò)爬蟲(chóng)的方法小結(jié)
這篇文章主要介紹了python實(shí)現(xiàn)selenium網(wǎng)絡(luò)爬蟲(chóng)的方法小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03

