ActiveRecord 在 Heroku 上错误加载二进制字段,在 OSX 上正常

发布于 2024-12-21 09:50:44 字数 405 浏览 1 评论 0原文

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

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

非常感谢任何帮助。

I have a rails 3.1 app that stores images in a binary field in a postgresql database (I am aware of potential issues with storing images in a database, but have to do so for now). Everything works fine locally in development mode and specs on OSX, but all images are broken in the app deployed to Heroku. I've verified that the data in the database is correct by pointing my local machine at the same database that the heroku instance uses, and all images displayed correctly.

So, the problem seems to lie in ActiveRecord (running on Heroku) loading the data from the database. I'm also guessing it is an encoding issue. Running the rails console locally I can verify that the bytesize of these fields are correct, but running the rails console on Heroku shows an incorrect bytesize. In fact, loading an N byte file via ActiveRecord on Heroku results in a bytesize of 2N+1 for all files.

Any help is greatly appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

幼儿园老大 2024-12-28 09:50:44

2n+1 听起来像是您从 bytea 获得十六进制输出,而不是旧的转义格式。我猜您使用的是专用数据库,这意味着 PostgreSQL 9.0 有一个 不同的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 来重新启动您的应用程序。

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

The 2n+1 smells like you're getting hex output from your bytea instead of the old escaped format. I'm guessing that you're using a dedicated database and that means PostgreSQL 9.0 which has a different default encoding for bytea:

When migrating from PostgeSQL 8.x to PostgreSQL 9.x you can run into issues with binary string compatibility. The default representation is hex in version 9 but version 8 it is set to escaped. You can make PostgreSQL 9 use escaped by manually setting bytea_output.

If I'm right then you can use the instructions in the above link or use this summarized version:

  1. In the command line type "heroku config vars" to get your system details.
  2. Extract the PostgreSQL username from your DATABASE_URL which looks like postgres://username:password@host/database_name.
  3. Use heroku pg:psql to get a PostgreSQL console.
  4. Execute ALTER ROLE username SET bytea_output TO 'escape'; from the the psql console where, of course, username is the username from (1).
  5. Exit psql do a heroku restart to restart your application.

Then try again and hopefully you'll get the right bytes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文