【问题标题】:ActiveRecord loads binary field incorrectly on Heroku, fine on OSXActiveRecord 在 Heroku 上错误地加载二进制字段,在 OSX 上很好
【发布时间】:2011-12-16 19:30:33
【问题描述】:

我有一个 rails 3.1 应用程序,它将图像存储在 postgresql 数据库中的二进制字段中(我知道在数据库中存储图像的潜在问题,但现在必须这样做)。在 OSX 上的开发模式和规范中,一切都在本地运行良好,但部署到 Heroku 的应用程序中的所有图像都损坏了。我已经通过将我的本地计算机指向 heroku 实例使用的同一个数据库来验证数据库中的数据是正确的,并且所有图像都正确显示。

所以,问题似乎在于 ActiveRecord(在 Heroku 上运行)从数据库加载数据。我也猜这是一个编码问题。在本地运行 rails 控制台我可以验证这些字段的字节大小是否正确,但在 Heroku 上运行 rails 控制台会显示不正确的字节大小。实际上,通过 Heroku 上的 ActiveRecord 加载 N 字节文件会导致所有文件的字节大小为 2N+1。

非常感谢任何帮助。

【问题讨论】:

  • 列类型是什么?
  • :rails 中的二进制文件,postgres 中的 bytea。

标签: ruby-on-rails postgresql activerecord encoding rails-activerecord


【解决方案1】:

2n+1 闻起来像是从 bytea 获取十六进制输出,而不是旧的转义格式。我猜您使用的是专用数据库,这意味着 PostgreSQL 9.0 有一个 different default encoding for bytea:

从 PostgeSQL 8.x 迁移到 PostgreSQL 9.x 时,您可能会遇到二进制字符串兼容性问题。版本 9 中的默认表示为十六进制,但版本 8 设置为转义。您可以通过手动设置 bytea_output 使 PostgreSQL 9 使用转义。

如果我是对的,那么您可以使用上述链接中的说明或使用此摘要版本:

  1. 在命令行中键入“heroku config vars”以获取您的系统详细信息。
  2. 从您的DATABASE_URL 中提取PostgreSQL 用户名,该用户名类似于postgres://username:password@host/database_name
  3. 使用 heroku pg:psql 获取 PostgreSQL 控制台。
  4. psql 控制台执行ALTER ROLE username SET bytea_output TO 'escape';,当然,username 是来自 (1) 的用户名。
  5. 退出psql 执行heroku restart 以重新启动您的应用程序。

然后再试一次,希望你能得到正确的字节。

【讨论】:

  • 谢谢!我实际上阅读了该文档,但认为这不是我的问题,因为将我的本地 dev rails 服务器指向同一个数据库(并使用同一个数据库用户)会产生工作图像。我想我仍然没有 100% 理解它,但它确实起到了作用。
  • 天才回答,谢谢!这解决了我非常相似的问题:stackoverflow.com/questions/12084414/…
  • 仅供参考,我们 Heroku Postgres 已将此设置为所有新入门级数据库的默认设置 (SET bytea_output TO 'escape')。您可以通过运行select setting from pg_settings where name = 'bytea_output'; 来验证这一点
  • @FrankGroeneveld 是的 :) devcenter.heroku.com/articles/…
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多