CX_ORACLE 庫使用

studywell發表於2018-10-22

參考

https://www.cnblogs.com/daisy89/p/5307727.html

官方文件:

oracle公司官方技術文件

第 1 部分:查詢最佳實踐

第 2 部分:處理時間和日期

第 3 部分:資料解析

第 4 部分:事務和大型物件

第 5 部分:儲存過程、Python 程式設計

第 6 部分:Python 支援 XML

第 7 部分:面向服務的 Python 架構

第 8 部分:適合 Oracle DBA 使用的 Python

第 9 部分:Jython 和 IronPython — 在 Python 中使用 JDBC 和 ODP.NET




1、安裝cx_Oracle包:

pip install cx_Oracle

         當前版本7.0


2、建立資料庫連線的三種方式:

方法一:使用者名稱、密碼和監聽分開寫

import cx_Oracle

db=cx_Oracle.connect('username/password@host/orcl')

db.close()

 


方法二:使用者名稱、密碼和監聽寫在一起

import cx_Oracle

db=cx_Oracle.connect('username','password','host/orcl')

db.close()


方法三:配置監聽並連線

import cx_Oracle

tns=cx_Oracle.makedsn('host',1521,'orcl')

db=cx_Oracle.connect('username','password',tns)

db.close()




3、建立cursor並執行SQL語句:查詢、更新、插入、刪除

建立資料庫連線,建立遊標cursor,然後執行sql語句,執行完成後,關閉遊標,關閉資料庫連線

建立連線後,建立cursor,並執行SQL語句


#encoding=utf-8


# 示例

import cx_Oracle

conn = cx_Oracle.connect('system/oracle@192.0.2.7/orcl')

cursor = conn.cursor()


#執行語句的兩種方式,預處理和直接執行

# 首先準備該語句,然後利用改變的引數執行 None。根據繫結變數時準備一個語句即足夠這一原則,Oracle 將如同在上例中一樣對其進行處理。準備好的語句可執行任意次。

sql = "select * from dba_users where user_id = :dbv"

cursor.prepare(sql)

rs = cursor.execute (None,{'dbv':63})

rsa = cursor.fetchall()

print (rsa)


# 直接執行

cursor.execute ("select * from dba_users where user_id=62")

row = cursor.fetchone ()

print (row[0])

cursor.close ()

conn.close()



import cx_Oracle


# 建立連線後,建立cursor,並執行SQL語句

db=cx_Oracle.connect('system','oracle','10.98.156.148/oral')

# db.close()


cr =  db.cursor() # 建立cursor

sql =  'select * from v$version'

cr.execute(sql) # 執行sql語句

# 一次返回所有結果集 fetchall

rs = cr.fetchall()

print("print all:(%s)" %rs)

for x in rs:

    print (x)


# 一次返回一行 fetchone

print("fetchone")

cr.execute(sql)

while (1):

    rs = cr.fetchone()

    if rs == None:

        break

    print(rs)


#使用引數查詢

pr = {'dbv':'61'}

cr.execute('select * from dba_users where user_id = :dbv',pr)

# 這裡將引數作為一個字典來處理

rs = cr.fetchall()

print("parameter print all:(%s)" %rs)


cr.execute('select * from dba_users where user_id =  :dbv',dbv = '61')

# 這裡直接寫引數

rs = cr.fetchall()

print("parameter print all: (%s)" %rs)

cr.close()

db.close()



#  插入、更新、刪除操作後需要提交commit

#  查詢include:select

def sqlSelect(sql,db):

    cr=db.cursor()

    cr.execute(sql)

    rs=cr.fetchall()

    cr.close()

    return rs


# 插入、更新、刪除操作後需要提交include:insert,update,delete

def sqlDML(sql,db):

    cr=db.cursor()

    cr.execute(sql)

    cr.close()

    db.commit()


# execute dml with parameters

def sqlDML2(sql,params,db):

    cr=db.cursor()

    cr.execute(sql,params)

    cr.close()

    db.commit()




#增刪改查 示例

#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})


#在繫結時,您可以首先準備該語句,然後利用改變的引數執行 None。根據繫結變數時準備一個語句即足夠這一原則,Oracle 將如同在上例中一樣對其進行處理。準備好的語句可執行任意次。

r1 = cursor.execute('SELECT * FROM locations WHERE country_id=:1 AND city=:2', ('US', 'Seattle'))



#資料庫操作簡單工具

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官方文件 

# oracle 日期函式

# 使用 EXTRACT 語句透過 SQL 查詢將年、月、日這些欄位提取出來

SELECT EXTRACT(YEAR FROM hire_date) FROM employees ORDER BY 1;


使用 Python 的 datetime.date、datetime.time 和 datetime.datetime 物件作為繫結變數來查詢日期


如果您需要將現有的字串分析為 date(time) 物件,可以使用 datetime 物件的 strptime() 方法。

>>> from datetime import datetime

>>> datetime.strptime("2007-12-31 23:59:59", "%Y-%m-%d %H:%M:%S")

datetime.datetime(2007, 12, 31, 23, 59, 59)




>>> import datetime

>>> d = datetime.datetime.now()

>>> print d

2007-03-03 16:48:27.734000

>>> print type(d)

<type 'datetime.datetime'>

>>> print d.hour, d.minute, d.second

(16, 48, 27)



--EXTRACT() 函式用於提取日期/時間的單獨部分,比如年、月、日、小時、分鐘等等。 

select sysdate,

       extract(year from sysdate),

       extract(month from sysdate),

       extract(day from sysdate)

  from dual s;

  

  

SELECT EXTRACT(HOUR FROM TIMESTAMP '2010-01-10 11:12:13'),

       EXTRACT(minute FROM TIMESTAMP '2010-01-10 11:12:13'),

       EXTRACT(second FROM TIMESTAMP '2010-01-10 11:12:13')

  FROM DUAL;




#精通 Oracle+Python,第 3 部分:資料解析


有關使用正規表示式的最好建議是儘可能地避免使用它們。在將它們嵌入程式碼前,請確定沒有字串方法可以完成相同的工作,因為字串方法更快且不會帶來匯入以及正規表示式處理這些額外的開銷。在字串物件上使用 dir() 就可以看到可用的內容。

下例展示了在 Python 這樣一種動態語言中看待正規表示式的方式。解析 tnsnames.ora 檔案以便為每個網路別名建立簡單連線字串(將 file() 函式指向您的 tnsnames.ora 檔案的位置):


>>> import re

>>> tnsnames = file(r'tnsnames.ora').read()

>>> easy_connects = {}

>>> tns_re = "^(\w+?)\s?=.*?HOST\s?=\s?(.+?)\).*?PORT\s?=\s?(\d+?)\).*?SERVICE_NAME\s?=\s?(.+?)\)"

>>> for match in re.finditer(tns_re, tnsnames, re.M+re.S):

...  t = match.groups()

...  easy_connects[t[0]] = "%s:%s/%s" % t[1:]

>>> print easy_connects

                           


此程式在 Oracle Database XE 預設的 tnsnames.ora 檔案上的輸出是:

{'XE': 'localhost:1521/XE'}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-2217021/,如需轉載,請註明出處,否則將追究法律責任。

相關文章