繁体   English   中英

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

[英]How do you create a BLOB column in rails postgresql database

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

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

当我在迁移中创建表时,

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

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

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

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

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

bytea是PostgreSQL的BLOB版本。 精细手册

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

所以bytea就是你想要的。 就格式而言:

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

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

这也可能是有趣的:

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。 我目前正在使用它并且效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM