[英]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標准定義了一種不同的二進制字符串類型,稱為
BLOB
或BINARY 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.