2016-10-04

RubyでPostgreSQLのレコードをCSV出力してみた

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)
このエントリーをはてなブックマークに追加