読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

psycopg2で画像データを読み書きする

psycopg2で画像データを読み書きする方法です。

実際のところ

画像データの格納にはbytea型を使います。
PostgreSQLのbytea型はmemorybuffer型を返すので、ちゃんとbytes関数なりで整形しないといけません。

import psycopg2

DSN  = "dbname=postgres user=shuzo_kino"
SQL3 = "INSERT INTO image(byte_data)\
        VALUES (%(imagedata)s);"
SQL4 = "SELECT byte_data FROM image \
        WHERE id = (%(id)s) LIMIT 1;"

def pushImage(query, filename):
  fp        = open(filename, "rb").read()
  imgdata   = psycopg2.Binary(fp)
  postquery = {'imagedata': imgdata}
  curs.execute(query, postquery)

def saveImage(query, filename, id):
  vals = {'id': id}
  curs.execute(query, vals)
  fp = curs.fetchone()[0]
  with open(filename,'wb') as file:
    file.write(bytes(fp))

with psycopg2.connect(DSN) as conn:
  with conn.cursor() as curs:
    distImg = "/Users/shuzo_kino/Desktop/sample.png"
    saveImage(SQL4, distImg, 16)

    sourceImg = "/Users/shuzo_kino/Mexico.Tacos.01.jpg"
    pushImage(SQL3, sourceImg)