Хранение бинарных объектов в postgres с использованием Ruby on Rails - PullRequest
4 голосов
/ 17 декабря 2011

Мне нужно хранить JSON-подобные объекты в нашей базе данных postgres.Первоначально я просто использовал сериализованные поля, но они занимали слишком много места.Поэтому я написал простую пользовательскую схему сжатия и теперь использую Marshal.dump / load для доступа к данным.Но я наткнулся на загадку с типом поля байтов postgres - он настаивает на том, чтобы каждый невидимый байт кодировался как трехзначное восьмеричное число, например, «\ 377».

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

Я не вижу простого способа добиться этого.s.pack ("m # {s.size}"), похоже, генерирует строки с одним '\', тогда как postgres хочет '\'.Добавление gsub (/ \ /, '\\\\') в конце, похоже, не решает проблему.

У кого-нибудь есть более элегантное (и работающее) решение?

1 Ответ

10 голосов
/ 17 декабря 2011

Предположительно, вы используете необработанный SQL для манипулирования этими bytea значениями, поскольку ActiveRecord самостоятельно заботится о кодировании и декодировании двоичных столбцов.Никогда не пытайтесь сами заключать в кавычки данные для использования в SQL, всегда используйте методы цитирования и экранирования драйвера.В этом случае вы должны использовать escape_bytea:

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

Аналогично, вы бы использовали unescape_bytea для декодирования bytea, еслиполучить экранированный вывод bytea значения базы данных.

...