python cx_Oracle的基礎使用方法(連接和增刪改查)
問題
使用python操作oracle數(shù)據(jù)庫,獲取表的某幾個字段作為變量值使用。
使用Popen+sqlplus的方法需要對格式進行控制,通過流獲取這幾個字段值不簡潔(個人觀點……)。(優(yōu)點是能夠使用sqlplus的方法直接訪問sql文件,不需要考慮打開/關閉連接,并且通過流向文件中寫入還挺好用的。不過優(yōu)點不是這次所關注的)
使用cx-Oracle將查詢結果返回為tuple格式,對返回結果的操作簡潔,滿足需求。(要注意數(shù)據(jù)庫連接創(chuàng)建與關閉、sql的編寫、預處理與提交等等,看起來也不簡潔(同樣個人觀點……))
基礎方法
數(shù)據(jù)庫連接
1、使用tns串連接
oracle_tns = cx_Oracle.makedsn('XXX.XXX.XXX.XXX', 1521,'oracleName') connectObj = cx_Oracle.connect('oracleUserName', 'password', oracle_tns)
2、其他簡潔方式
db = cx_Oracle.connect('hr', 'hrpwd', 'localhost:1521/XE') db1 = cx_Oracle.connect('hr/hrpwd@localhost:1521/XE')
數(shù)據(jù)庫斷開連接
connectObj.close()
建立游標
cursorObj = connectObj.cursor()
關閉游標
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
- 增、刪、改操作都需要當前連接進行commit()
- 若使用一個游標cursor進行N次查詢,注意若再使用前N-1次查詢結果可能會存在異常。要進行多個查詢,個人建議使用完cursor后將結果保留再關閉cursor,多次查詢重復該操作。
- 如果不使用prepare,可以直接使用execute,以下查詢等價:
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語句的語法與數(shù)據(jù)庫有關,不想使用綁定變量,可以拼接sql字符串 (´•༝•`)
簡單工具
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): # 將查詢結果由tuple轉為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 亂碼問題(cx_Oracle)
用python連接Oracle是總是亂碼,最后發(fā)現(xiàn)時oracle客戶端的字符編碼設置不對。
編寫的python腳本中需要加入如下幾句:
import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
這樣可以保證select出來的中文顯示沒有問題。
要能夠正常的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設置及編碼轉換
①在Oracle客戶端向服務器端提交SQL語句時,Oracle客戶端根據(jù)NLS_LANG和數(shù)據(jù)庫字符集,對從應用程序接傳送過來的字符串編碼進行轉換處理。如果NLS_LANG與數(shù)據(jù)庫字符集相同,不作轉換,否則要轉換成數(shù)據(jù)庫字符集并傳送到服務器。服務器在接收到字符串編碼之后,對于普通的CHAR或VARCHAR2類型,直接存儲;對于NCHAR或NVARCHAR2類型,服務器端將其轉換為國家字符集再存儲。
①在Oracle客戶端向服務器端提交SQL語句時,Oracle客戶端根據(jù)NLS_LANG和數(shù)據(jù)庫字符集,對從應用程序接傳送過來的字符串編碼進行轉換處理。如果NLS_LANG與數(shù)據(jù)庫字符集相同,不作轉換,否則要轉換成數(shù)據(jù)庫字符集并傳送到服務器。服務器在接收到字符串編碼之后,對于普通的CHAR或VARCHAR2類型,直接存儲;對于NCHAR或NVARCHAR2類型,服務器端將其轉換為國家字符集再存儲。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
參考文章
精通 Oracle+Python,第 1 部分:查詢最佳應踐
- 配置python連接oracle讀取excel數(shù)據(jù)寫入數(shù)據(jù)庫的操作流程
- 解決python3.6用cx_Oracle庫連接Oracle的問題
- 基于python連接oracle導并出數(shù)據(jù)文件
- Python連接Oracle之環(huán)境配置、實例代碼及報錯解決方法詳解
- 使用Python腳本zabbix自定義key監(jiān)控oracle連接狀態(tài)
- 解決python通過cx_Oracle模塊連接Oracle亂碼的問題
- Python3連接SQLServer、Oracle、MySql的方法
- Python3.6連接Oracle數(shù)據(jù)庫的方法詳解
- windows下python連接oracle數(shù)據(jù)庫
- python安裝oracle擴展及數(shù)據(jù)庫連接方法
- python連接oracle數(shù)據(jù)庫實例
- 教你使用Python連接oracle
相關文章
關于Python八大排序實現(xiàn)方法(冒泡排序、快速排序等)
這篇文章主要介紹了關于Python八大排序實現(xiàn)方法,主要有基數(shù)排序、歸并排序、堆排序、簡單選擇排序、直接插入排序、希爾排序、快速排序、冒泡排序等,需要的朋友可以參考下2023-03-03python實現(xiàn)selenium網絡爬蟲的方法小結
這篇文章主要介紹了python實現(xiàn)selenium網絡爬蟲的方法小結,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03