【云圖說】第235期 DDS讀寫兩步走 帶您領略只讀節點的風采
1232
2025-04-01
假定Oracle的表結構是這樣的:
CREATE TABLE aurora( date_forecast VARCHAR2(10), filename VARCHAR2(24), content BLOB );
1
2
3
4
5
BLOB寫操作
現在我有3個python的數據,分別是:
date_forecast = ‘2011-06-29’ filename = ‘aurora.jpg’’ file = open('aurora.jpg', 'rb')’ content = fp.read() fp.close()
1
2
3
4
5
網上的資料說,插入包含blob的記錄,需要先插入空的blob對象,然后再update該記錄——這意味著,一次INSERT操作,至少要訪問3次數據庫。但是,這里面有個問題無法解決:python如何給Oracle的blob對象賦值?仔細閱讀Oracle的文檔,發現在SQL語句中,可以使用冒號(:)來定義變量,而cx_Oracle模塊中也的確有cx_Oracle.BLOB對象。至此,可以整理出這樣的一個思路:
sqlStr = "INSERT INTO aurora (date_forecast, filename, content) VALUES ('%s', '%s', :blobData)" % (date_forecast, filename)
1
請注意blobData前邊的冒號,是定義了一個叫做blobData的Oracle變量。然后:
cursor.setinputsizes(blobData=cx_Oracle.BLOB)
1
將blobData變量定義為cx_Oracle.BLOB的實例,終于讓python和Oracle握手了。接下來,就是水到渠成的事情了:
cursor.execute(sqlStr, {'blobData':content}) cursor.execute('commit')
1
2
BLOB讀操作
sqlStr = "SELECT date_forecast, filename, content FROM (SELECT date_forecast, filename, content FROM aurora ORDER BY date_forecast DESC) where ROWNUM < 2 " cursor.execute(sqlStr) result = cursor.fetchall()
1
2
3
此時,result[0][2]就是BLOB對象,python如何操作它呢?
print dir(cx_Oracle.BLOB)
1
發現cx_Oracle.BLOB有一個read方法:
print type(result[0][2].read())
1
終于看到熟悉的str類型,搞定!
file = open('aurora.jpg', "wb") file.write(result[0][2].read()) file.close()
1
2
3
Oracle Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。