RubyでPostgreSQLのレコードをCSV出力したときの備忘録。PostgreSQLの場合、psqlでCOPY文を投げればCSV化してくれますが、一部を変数に置き換えたり、条件を柔軟に切り替えたり、自動化するにはやはりプログラムからSQLを投げるのが良かったりします。
ということで、今回はRubyのpgライブラリを利用してCSV出力してみました。ActiveRecordだとちょっと大掛かりになってしまうのと、SQLを直接書かない場合はSQLが見えづらく、直接書く場合は旨味が無いので利用を見送りました。
コードはこんな感じ
#!/usr/bin/env ruby
require 'pg'
require 'settingslogic'
require 'erb'
class Settings < Settingslogic
source "application.yml"
namespace 'development'
end
csv = []
file = open(ARGV[0])
conn = PG.connect(Settings.to_h)
conn.copy_data "COPY (#{ERB.new(file.read).result}) TO STDOUT (FORMAT CSV, HEADER TRUE)" do
while row = conn.get_copy_data
csv.push(row)
end
end
puts csv
ActiveRecordを利用しないとは言え、YAMLでDBパラメータを書いてそれを良い感じに読み込ませたかったので、Settingslogicを使っています。
application.ymlはこんな感じで
development:
host: xxxx
port: 5432
user: xxxx
password: xxxx
dbname: xxxx
また、ERB形式で書いたSQLファイルを読むことで変数を設定することができますし、Rubyで条件を書いたりできます。
Heroku PostgresのようにURI形式で指定する場合は以下のようにすればOK。
uri = URI.parse(ENV['DATABASE_URL'])
conn = PG.connect(host: uri.hostname,
port: uri.port,
dbname: uri.path[1..-1],
user: uri.user,
password: uri.password)