如何在rails postgresql数据库中创建BLOB列

时间:2012-07-12 04:53:19

标签: ruby-on-rails postgresql heroku blob

我正在尝试将二进制数据存储在数据库中。 (关于heroku的postgresql)

据我所知,有两种不同的方法可以在postgresql中存储二进制数据。一个blob和一个bytea ..

当我在迁移中创建表时,

create_table :binaries do |t|
  t.binary :data
end

它在bytea类型的数据库中创建一个列。

我的问题是..如何创建blob类型的记录?

我为什么这么问?似乎当我发送一个十字节文件到heroku时,它将它存储为一个十六进制值的字符串,前面带有“e”..所以我的10个字节变为21.我的10兆字节文件将变为20兆(和一个字节) ),ext,ext,ext ...
现在困扰我,但因为我并不真正关心表现。 (我已经得到了PM的照顾),这不是最困扰我的 真正困扰我的是;当我读出数据库的内容时,我得到21个字节,而不是10.这是不可用的。

所以我的问题再次出现..如何在rails / postgresql / heroku环境中创建BLOB列?

2 个答案:

答案 0 :(得分:10)

bytea是PostgreSQL的BLOB版本。来自fine manual

  

SQL标准定义了一种不同的二进制字符串类型,称为BLOBBINARY LARGE OBJECT。输入格式与bytea不同,但提供的函数和运算符大致相同。

所以bytea就是你想要的。格式如下:

  

bytea类型支持两种输入和输出的外部格式:PostgreSQL的历史“转义”格式和“十六进制”格式。输入时始终接受这两个。输出格式取决于配置参数bytea_output;默认值为十六进制。 (注意,在PostgreSQL 9.0中引入了十六进制格式;早期版本和一些工具不理解它。)

所以你所看到的只是用于将数据导入数据库和数据库之外的文本版本。

这也可能是有意义的:

答案 1 :(得分:3)

Blob存储内置于Postgres中,并且使用ActiveRecord适配器支持,但只能直接通过原始连接和lo_*方法。您可以使用lo_write, lo_open, lo_close and lo_read来创建和操作blob。创建blob会返回一个OID,您可以在模型中引用blob。

您可以使用迁移

添加此内容
rails g migration AddFileToModel file:oid

或直接喜欢这个

add_column :users, :avatar, :oid

对于这方面的工作示例,您应该查看Carrierwave PostgreSQL gem。您可以根据该代码构建自定义解决方案,也可以直接使用Carrierwave。我目前正在使用它并且效果很好。