2011-12-17 45 views
4

我需要在我們的postgres數據庫中存儲類似JSON的對象。 最初我只是使用序列化字段,但他們是 消耗太多的空間。所以我寫了一個簡單的自定義壓縮 方案,現在使用Marshal.dump/load來訪問數據。 但我用postgres的bytea字段類型碰到了一個障礙 - 它堅持 每個不可見字節都被編碼爲3位八進制數,例如, '\ 377'。使用Ruby on Rails在Postgres中存儲二進制對象

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

我看不到一個簡單的方法來實現這一目標。 s.pack(「m#{s.size}」) 似乎用單個'\'生成字符串,而postgres想要'\'。 在結尾添加gsub(/ \ /,'\\\\')似乎並不能解決問題。

有沒有人有更優雅(和工作)的解決方案?

回答

10

假設您使用原始SQL來處理這些bytea值,因爲ActiveRecord負責自己編碼和解碼二進制列。切勿嘗試引用數據以便在SQL中使用,請始終使用驅動程序的引用和轉義方法。在這種情況下,你應該使用escape_bytea

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

同樣,你會使用unescape_byteabytea解碼如果你拿到了數據庫的轉義bytea值輸出。

+0

這樣做。謝謝! – 2011-12-19 18:18:48