質問: こんにちは。python3を使ってSQliteに接続し、PDFや画像データなどを登録したいと思っています(リンクを登録するのではなくデータを直接登録したいと考えています)。 blob型というものがあるというところまでは分かるのですが、 ・画像データ→blob型への変換はどうしたらよいか ・pythonでそれを実現するにはどうしたらよいか が分からず困っています。 自分なりに検索してみたのですがやり方が分かりません。 教えていただけると助かります。 よろしくお願いいたします。
回答: SQLite3はBLOBを標準でサポートしています。 Web上を検索するとpython2.xで`buffer(blob)`を使ってバイナリを渡すサンプルコードが見つかりますが、python3ではバイナリデータを直接insertできます。 selectもバイナリデータをそのまま返してくれますので、バイナリを書き込めば画像を復元できます。 下記のサンプルコードの読み込み画像ファイルパスをpdfに書き換えるだけでpdfの読み書きも可能です。 ``` import sqlite3 from contextlib import closing rf = 'C:\\test\\read.jpg' #読み込み画像ファイルパス wf = 'C:\\test\\write.jpg' #書き込み画像ファイルパス with closing(sqlite3.connect('blob_test.db')) as db: #適当にテーブル作成 cursor = db.cursor() try: cursor.execute('create table img_table (img blob);') except sqlite3.OperationalError: cursor.execute('delete from img_table') #バイナリ読み込み with open(rf, 'rb') as f: blob = f.read() #レコード追加してコミット db.execute('insert into img_table values(?)', [blob]) db.commit() #せれくと for row in cursor.execute('select img from img_table limit 1'): blob = row[0] #バイナリ出力 with open(wf, 'wb') as f: f.write(blob) #後始末 db.execute('drop table img_table') ```