摘要:使用的方法需要對格式進行控制,通過流獲取這幾個字段值不簡潔個人觀點。優點是能夠使用的方法直接訪問文件,不需要考慮打開關閉連接,并且通過流向文件中寫入還挺好用的。要進行多個查詢,個人建議使用完后將結果保留再關閉,多次查詢重復該操作。
問題
使用python操作oracle數據庫,獲取表的某幾個字段作為變量值使用。
使用Popen+sqlplus的方法需要對格式進行控制,通過流獲取這幾個字段值不簡潔(個人觀點……)。(優點是能夠使用sqlplus的方法直接訪問sql文件,不需要考慮打開/關閉連接,并且通過流向文件中寫入還挺好用的。不過優點不是這次所關注的)
使用cx-Oracle將查詢結果返回為tuple格式,對返回結果的操作簡潔,滿足需求。(要注意數據庫連接創建與關閉、sql的編寫、預處理與提交等等,看起來也不簡潔(同樣個人觀點……))
基礎方法 數據庫連接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")
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語句的語法與數據庫有關,不想使用綁定變量,可以拼接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參考文章
精通 Oracle+Python,第 1 部分:查詢最佳應踐
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44470.html
摘要:連接當前環境下載安裝包由于我本地版本是所以選擇是版本參考安裝包列表安裝安裝查看當前引入模塊庫的路徑檢查安裝路徑,如果文件不在以上引入路徑內需要將該文件拷貝到以上引入路徑所以我這里不需要進行拷貝操作 Python連接Oracle 當前環境:Linux Centos 7 1. 下載安裝包cx_Oracle 由于我本地Python版本是2.7,所以選擇是2.7版本 wget https:...
http://www.cs.utexas.edu/~mitra/csSpring2011/cs327/cx_mac.html Build and Install cx_Oracle on Mac Leopard Intel I finally succeeded in building and installing cx_Oracle on a Mac. I will outline the ...
閱讀 2397·2021-10-09 09:44
閱讀 2132·2021-10-08 10:05
閱讀 3423·2021-07-26 23:38
閱讀 2991·2019-08-28 18:16
閱讀 812·2019-08-26 11:55
閱讀 1820·2019-08-23 18:29
閱讀 2034·2019-08-23 18:05
閱讀 1364·2019-08-23 17:02