欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年11月19日 16:44:30   作者:莫顯輝  
這篇文章主要給大家介紹了關于python cx_Oracle的基礎使用方法,其中包括連接、增刪改查等基本操作,并給大家分享了python 連接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計算階乘的兩個函數(shù)用法

    python計算階乘的兩個函數(shù)用法

    這篇文章主要介紹了python計算階乘的兩個函數(shù)用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python復制文件代碼實現(xiàn)

    python復制文件代碼實現(xiàn)

    最近在備份手機上的照片的時候,純手工操作覺得有些麻煩,就想寫個腳本自動進行。因為備份的時候有些照片以前備份過了,所以需要有個判重操作,看下面的實現(xiàn)代碼
    2013-12-12
  • python常用小腳本實例總結

    python常用小腳本實例總結

    在日常的工作中我們總會面臨到各式各樣的問題,下面這篇文章主要給大家介紹了關于python常用小腳本的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Python計算IV值的示例講解

    Python計算IV值的示例講解

    今天小編就為大家分享一篇Python計算IV值的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 關于Python八大排序實現(xiàn)方法(冒泡排序、快速排序等)

    關于Python八大排序實現(xiàn)方法(冒泡排序、快速排序等)

    這篇文章主要介紹了關于Python八大排序實現(xiàn)方法,主要有基數(shù)排序、歸并排序、堆排序、簡單選擇排序、直接插入排序、希爾排序、快速排序、冒泡排序等,需要的朋友可以參考下
    2023-03-03
  • python實現(xiàn)ip代理池功能示例

    python實現(xiàn)ip代理池功能示例

    這篇文章主要介紹了python實現(xiàn)ip代理池功能,結合實例形式分析了Python IP代理池的實現(xiàn)原理及相關操作技巧,需要的朋友可以參考下
    2019-07-07
  • 運用python去除圖片水印

    運用python去除圖片水印

    本文介紹了如何運用python去除圖片的水印,文中使用圖片以及代碼詳細的介紹了兩種去除的方法,感興趣的朋友可以自己參考一下
    2021-08-08
  • python 正則式 概述及常用字符

    python 正則式 概述及常用字符

    python 正則,剛開始需要注意的他的正則的獨特的地方。不同語言的正則稍有不同。
    2009-05-05
  • python實現(xiàn)selenium網絡爬蟲的方法小結

    python實現(xiàn)selenium網絡爬蟲的方法小結

    這篇文章主要介紹了python實現(xiàn)selenium網絡爬蟲的方法小結,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • numpy.insert用法及內插插0的方法

    numpy.insert用法及內插插0的方法

    本文主要介紹了numpy.insert用法及內插插0的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03

最新評論