LoginSignup
6
8

More than 1 year has passed since last update.

【PostgreSQL】バイナリ保存

Last updated at Posted at 2014-03-05

がっつりハマりました。
WEBの勉強初めて一番絶望的にわからなかった。

WEBというかDBだったんですが。

RailsアプリでPostgreSQLを使用し、DBに画像データをバイナリデータとして保存しています。しかし、環境によってDBに保存されるデータの形式が変わってしまいます。

QA@ITに質問した後に、キーワードをひねってたら解決策に辿り着いた。

正しいデータ(意図するデータ)

"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x05\xDC\x00\x00\x02X\b"

問題のデータ

"x89504e470d0a1a0a0000000d49484452000005dc0000025808..."

保存処理のコード

コンソールから再現できたのでその際のコードです(irb)。

file = ActionDispatch::Http::UploadedFile.new(tempfile: File.open(Rails.root.to_s + "/public/bg.png"))
image = MiniMagick::Image.read(file)
Master::Image.first.update_attribute(:data, image.to_blob)

上記を実行すると、Master::Image.first.dataに入っているバイナリデータに差異が出ます。

環境の差異

正しいデータとなる環境

ローカルの環境と、AWS上のAmazonLinux(DBとしてRDSを使用)では上手く行きました。

  • ローカルのMacOSX、homebrewにてpostgreSQL, ImageMagickをインストール
  • AWSのRDS

問題のデータとなる環境

  • CentOS6.4
    • PostgreSQL 9.3.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit

VPS上のCentOSで現象を確認後、VMに構築したCentOSでも問題が再現しました。

解決策

  • alter role [username] set bytea_output to ‘escape’;

としてやると無事画像データのまま保存されました。

色々と調査するときは冷静に検索キーワードを変えてみることですね。

今回は「postgres bytea activerecord」で引っかかりました。

英語を読めるのは必須ですね。WEB技術は。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8