2016-05-14 16 views
1

私は、LONGBLOBデータ型を持つmysqlテーブルをカラムの1つとして持っています。私はその列に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のコマンドパーサーをトリップせずにコマンドを実行できるようにデータをエンコードする必要があります。

1つの方法は、base64がアスキー文字セットにマッピングされるようにコンテンツをエンコードすることです。

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

今すぐこのブロブをデータベースに挿入してください。

もう一つの標準的な方法は、[1]の助言に従って、 `MySQLdb.escape_string 'を使うことです。

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

PS:私はそれらをテストしていません。

+1

ありがとうございました。私はbase64デコード関数でpdfに変換しようとしましたが、それもうまくいきます。 – pksree

0

コードをわずかに変更してBLOBとしてPDFを挿入することができました。

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) 
関連する問題