使用Ruby on Rails在postgres中存储二进制对象

时间:2011-12-17 05:51:33

标签: ruby-on-rails postgresql binary

我需要在postgres DB中存储类似JSON的对象。 最初我只是使用序列化字段,但他们是 消耗太多空间。所以我写了一个简单的自定义压缩 方案,我现在使用Marshal.dump / load来访问数据。 但是我用postgres的bytea字段类型遇到了障碍 - 它坚持说 将每个不可见字节编码为3位八进制数,例如, '\ 377'。

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

我看不到实现这一目标的简单方法。 s.pack(“m#{s.size}”) 似乎用单个'\'生成字符串,而postgres想要'\'。 在最后添加gsub(/ \ /,'\\\\')似乎无法解决它。

有没有人有更优雅(和工作)的解决方案?

1 个答案:

答案 0 :(得分:10)

据推测,您正在使用原始SQL来操作这些bytea值,因为ActiveRecord会自行处理二进制列的编码和解码。永远不要尝试引用数据以便在SQL中使用,始终使用驱动程序的引用和转义方法。在这种情况下,您应该使用escape_bytea

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

同样,如果您获得数据库的转义bytea值,则可以使用unescape_bytea解码bytea