Help us understand the problem. What is going on with this article?

【PostgreSQL】バイナリ保存

More than 5 years have passed since last update.

がっつりハマりました。
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技術は。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした