CX_ORACLE 庫使用
參考
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- cx_oracle 使用Oracle
- python資料庫模組-Cx_OraclePython資料庫Oracle
- python使用cx_Oracle連線oracle資料庫獲取常用資訊PythonOracle資料庫
- pyinstaller打包cx_Oracle庫問題處理記錄Oracle
- cx_Oracle 連線 OracleOracle
- python cx_Oracle: UnicodeEncodeError: 'ascii' codec can't encode charactersPythonOracleUnicodeErrorASCII
- 第八篇:cx_Oracle出現的問題Oracle
- python連線Oracle的外掛cx_Oracle安裝PythonOracle
- Python安裝cx_Oracle模組遇到的問題PythonOracle
- CentOS7.1安裝Oracle 12.1客戶端以及cx_OracleCentOSOracle客戶端
- 元件庫使用BEM元件
- 動態庫使用
- 如何使用grequests庫
- 如何使用Guzzle庫
- 如何使用htmltab庫HTML
- 如何使用 RestSharp 庫REST
- WebBits庫如何使用Web
- 如何使用RCurl庫
- Git 子庫使用Git
- 使用pip管理庫
- Urllib庫的使用一---基本使用
- 如何使用Mechanize::PhantomJS庫JS
- 21.8 Python 使用BeautifulSoup庫Python
- 使用treq庫下載
- (五)time庫的使用
- (二)turtle庫的使用
- Python curses庫如何使用Python
- 阿里圖示庫使用阿里
- golang常用庫:配置檔案解析庫-viper使用Golang
- Django資料庫類庫MySQLdb使用詳解Django資料庫MySql
- golang常用庫:日誌記錄庫-logrus使用Golang
- 【Falsk 使用資料庫】---- 資料庫基本操作資料庫
- iOS動態庫的使用iOS
- Bitcoin序列化庫使用
- Git 使用遠端倉庫Git
- 使用mysqlclient庫連線mysqlMySqlclient
- Python——Reflex(資料庫使用)PythonFlex資料庫
- Iron Python中使用NLTK庫Python