41707


こんにちは。python3を使ってSQliteに接続し、PDFや画像データなどを登録したいと思っています（リンクを登録するのではなくデータを直接登録したいと考えています）。

blob型というものがあるというところまでは分かるのですが、  
・画像データ→blob型への変換はどうしたらよいか  
・pythonでそれを実現するにはどうしたらよいか  
が分からず困っています。

自分なりに検索してみたのですがやり方が分かりません。  
教えていただけると助かります。  
よろしくお願いいたします。


CC BY-SA 3.0
2018-02-12T22:11:58.397
41677
2018-02-14T09:43:52.287
2018-02-13T00:38:33.697
19110
27385
question
python python3 database sqlite
python3＋SQlite　でPDFデータをINSERTするにはどうすればよいか


SQLite3はBLOBを標準で[サポート](https://docs.python.jp/3/library/sqlite3.html#sqlite3.connect)しています。

Web上を検索するとpython2.xで`buffer(blob)`を使ってバイナリを渡すサンプルコードが見つかりますが、python3ではバイナリデータを直接insertできます。  
selectもバイナリデータをそのまま返してくれますので、バイナリを書き込めば画像を復元できます。

下記のサンプルコードの読み込み画像ファイルパスをpdfに書き換えるだけでpdfの読み書きも可能です。

[code]

    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')
    
[/code]


CC BY-SA 3.0
2018-02-14T09:43:52.287
41707
2018-02-14T09:43:52.287
9820
41677
answer