ActiveRecord неправильно загружает бинарное поле на Heroku, нормально на OSX - PullRequest
8 голосов
/ 16 декабря 2011

У меня есть приложение rails 3.1, которое хранит изображения в двоичном поле в базе данных postgresql (я знаю о потенциальных проблемах с хранением изображений в базе данных, но сейчас я должен это сделать).Все отлично работает локально в режиме разработки и спецификациях для OSX, но все образы не работают в приложении, развернутом в Heroku.Я проверил, что данные в базе данных верны, указав на моем локальном компьютере ту же базу данных, которую использует экземпляр heroku, и все изображения отображаются правильно.

Итак, проблема, похоже, заключается в ActiveRecordна Heroku) загрузка данных из базы данных.Я также предполагаю, что это проблема кодирования.Локально запустив консоль rails, я могу убедиться в правильности байтового размера этих полей, но при запуске консоли rails на Heroku отображается неверный размер байта.Фактически загрузка N-байтового файла через ActiveRecord в Heroku приводит к увеличению размера байта 2N + 1 для всех файлов.

Любая помощь приветствуется.

1 Ответ

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

2n + 1 пахнет, как будто вы получаете шестнадцатеричный вывод из вашего bytea вместо старого экранированного формата.Я предполагаю, что вы используете выделенную базу данных, и это означает, что PostgreSQL 9.0 имеет другую кодировку по умолчанию для bytea :

При миграции с PostgeSQL 8.x на PostgreSQL9.x вы можете столкнуться с проблемами совместимости двоичных строк.Представление по умолчанию - шестнадцатеричное в версии 9, но в версии 8 установлено экранирование.Вы можете отключить использование PostgreSQL 9 вручную, установив bytea_output вручную.

Если я прав, вы можете воспользоваться инструкциями по ссылке выше или использовать эту краткую версию:

  1. В командной строке введите « heroku config vars » для получения сведений о вашей системе.
  2. Извлеките имя пользователя PostgreSQL из вашего DATABASE_URL, которое выглядит как postgres://username:password@host/database_name.
  3. Используйте heroku pg:psql для получения консоли PostgreSQL.
  4. Выполните ALTER ROLE username SET bytea_output TO 'escape'; из консоли psql, где, конечно, username - это имя пользователя из (1).
  5. Выход psql Выполните heroku restart, чтобы перезапустить приложение.

Затем повторите попытку и, надеюсь, вы получите правильные байты.

...