2011-12-17 6 views
4

私たちのpostgres DBにJSONのようなオブジェクトを格納する必要があります。 元々はシリアル化されたフィールドを使用していましたが、余分なスペースを消費するのは でした。そこで私は単純なカスタム圧縮 スキームを書いて、データにアクセスするためにMarshal.dump/loadを使用しています。 しかし、私はpostgresのbyteaフィールドタイプの問題にぶつかりました。それは、すべての非可視バイトが3桁の8進数としてエンコードされていると言います( )。 '\ 377'Ruby on Railsを使用してpostgresにバイナリオブジェクトを格納する

http://www.postgresql.org/docs/8.1/static/datatype-binary.html

私はこれを達成するための簡単な方法を見ることはできません。 s.pack( "m#s.size") は、 '\'が1つの文字列を生成するようですが、postgresは '\'が必要です。 最後にgsub(/ \ /、 '\\\\')を追加しても解決しないようです。

もっと洗練されたソリューションをお持ちの方はいらっしゃいますか?

答えて

10

おそらく、ActiveRecordがバイナリ列のエンコードとデコードを自動的に処理するため、生のSQLを使ってこれらの値を操作しています。絶対にSQLで使用するためにデータを引用しようとはしないでください。常に、ドライバのクォートとエスケープ方法を使用してください。この場合は、あなたがescape_byteaを使用する必要があります:あなたは、データベースのエスケープbytea値出力を取得する場合

encoded = ActiveRecord::Base.connection.escape_bytea(raw_bytes) 

同様に、あなたはbyteaをデコードするunescape_byteaを使用すると思います。

+0

それはトリックでした。ありがとうございました! –

関連する問題