国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python cx_Oracle的基礎使用方法(連接和增刪改查)

2020-01-04 16:20:01
字體:
來源:轉載
供稿:網友

問題

使用python/272352.html">python/118358.html">python操作oracle/124171.html">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

python 連接 Oracle 亂碼問題(cx_Oracle)

用python連接Oracle是總是亂碼,最后發現時oracle客戶端的字符編碼設置不對。

編寫的python腳本中需要加入如下幾句:

import osos.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

這樣可以保證select出來的中文顯示沒有問題。

要能夠正常的insert和update中文,還需要指定python源文件的字符集密碼和oracle一致。

# -*- coding: utf-8 -*-

例子:

# -*- coding: utf-8 -*-import osos.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' #或者os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8' import cx_Oracledb = cx_Oracle.connect(username/passwd@host:port/sevicename)cursor = db.cursor()#其他操作db.commit()db.close()

參考:

客戶端的NLS_LANG設置及編碼轉換

      ①在Oracle客戶端向服務器端提交SQL語句時,Oracle客戶端根據NLS_LANG和數據庫字符集,對從應用程序接傳送過來的字符串編碼進行轉換處理。如果NLS_LANG與數據庫字符集相同,不作轉換,否則要轉換成數據庫字符集并傳送到服務器。服務器在接收到字符串編碼之后,對于普通的CHAR或VARCHAR2類型,直接存儲;對于NCHAR或NVARCHAR2類型,服務器端將其轉換為國家字符集再存儲。

      ①在Oracle客戶端向服務器端提交SQL語句時,Oracle客戶端根據NLS_LANG和數據庫字符集,對從應用程序接傳送過來的字符串編碼進行轉換處理。如果NLS_LANG與數據庫字符集相同,不作轉換,否則要轉換成數據庫字符集并傳送到服務器。服務器在接收到字符串編碼之后,對于普通的CHAR或VARCHAR2類型,直接存儲;對于NCHAR或NVARCHAR2類型,服務器端將其轉換為國家字符集再存儲。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。

參考文章

精通 Oracle+Python,第 1 部分:查詢最佳應踐


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汉川市| 闽清县| 繁峙县| 翼城县| 赤城县| 武夷山市| 平远县| 固阳县| 长宁区| 镇宁| 彭水| 怀柔区| 滕州市| 青川县| 文昌市| 板桥市| 丹东市| 衡阳县| 乐业县| 京山县| 江门市| 苗栗县| 时尚| 渭源县| 郁南县| 喀喇沁旗| 上林县| 平邑县| 太和县| 德化县| 金华市| 梅河口市| 云和县| 新绛县| 皋兰县| 兴义市| 砚山县| 施甸县| 田东县| 佛冈县| 高平市|