Posted at

SequelでPostgreSQLのバイナリデータを扱う

PostgreSQLにはbyteaという型があり1、バイナリデータを表現することができます。

Sequelbytea型を取り扱う方法を解説します。


migration

マイグレーションファイルは以下のように書きます:


001_create_table.rb

Sequel.migration do

change do
create_table :some_table do
bytea :content1 # => PostgreSQL固有の書き方
File :content2 # => PostgreSQLではbytea型として解釈され、他のRDBMSではblob型などとして解釈される
end
end
end


insert

insertは以下のように書きます:


insert.rb

binary_data = File.read('hoge.png')

content = Sequel::SQL::Blob.new(binary_data)
DB[:some_table].insert(content1: content)

String をそのままinsertすることはできません。Sequel::SQL::Blob 2 に変換する必要があります。


select

selectは以下のように書きます:


select.rb

content = DB[:some_table].first.content1

File.write('some_image.png', content.to_s)

データベースから取り出した値は Sequel::SQL::Blob 2 になっています。#to_sメソッドを呼ぶことで元のバイナリデータを取得することができます。