2016-05-14 193 views
1

我有一個MySQL表,LONGBLOB數據類型作爲其中一列。我想將PDF插入到該列中。我試過這個。使用python插入和檢索mySQL BLOB中的PDF

file = open(r'path to file\myfile.pdf', 'rb').read() 
id='2' 
q1 = QSqlQuery("INSERT INTO table_1 (id_val,pdf_name) VALUES (%s,%s)"%(id,file)) 

此代碼不插入id_val和PDF到表中,並且它沒有顯示任何錯誤。然後我分割代碼。

file = open(r'path to file\myfile.pdf', 'rb').read() 
id='2' 
q1 = QSqlQuery("INSERT INTO table_1 (id_val) VALUES (%s)"%(id)) 
q2 = QSqlQuery("UPDATE table_1 SET pdf_name=%s WHERE id_val='2'"%(file)) 

該代碼將id_val插入表中,但不更新BLOB pdf。

有人可以幫忙嗎?

回答

0

它的失敗,因爲文件的內容在本質上是二進制和SQL命令與文本數據相連來。

爲了達到這個目的,我們必須對數據進行編碼,以便它可以沿着命令行,而不會跳過MySQL的命令解析器。

一種方法是base64對內容進行編碼,使其映射到ascii字符集。

import base64 
with open('path to your pdf', 'rb) as f: 
    blob = base64.b64encode(f.read()) 

現在將此blob插入到您的數據庫中。

其他更標準的方法是遵循[1]中的建議並使用`MySQLdb.escape_string'。

[1] http://flylib.com/books/en/2.785.1.163/1/

PS:我還沒有對它們進行測試。

+1

謝謝。我嘗試了它,並且工作。我已經嘗試通過base64解碼功能轉換回pdf,這也很好。 – pksree

0

我能夠將PDF作爲BLOB插入,並在代碼中稍作修改。

file = open(r'path to file\file.pdf', 'rb').read() 
id='2' 
q1= 'INSERT INTO table_1(id_val,pdf_name) VALUES(%s,%s)'  
a1 = (id,file) 
cursor=db.cursor() 
cursor.execute(q1,a1) 
相關問題