エラー処理、大規模のものについての対応は特にしていません。
あまり綺麗ではない。
とりあえず、開発準備用
pg_export.rb
require 'csv'
require 'pg'
require 'uri'
require "json"
require "yaml"
# PostgreSQL の指定DB,テーブルを全てCSV,YAML,JSON化する。
# 全てのフィールドを文字列として、改行コードは\r\nに変換して出力する
# こちらに DB, テーブル を指定する
db_attrs = {
'dbname' => [
"tblname",
"tblname2",
],
}
def puts_db_csv(f,db_name,table_name)
# Output a table of current connections to the DB
conn = PG.connect( dbname: db_name )
conn.exec( "SELECT * FROM #{table_name}" ) do |result|
result.each_with_index do |row, i|
# 1行目の前にキー列を出力しておく
if i == 0
k_arr = []
row.each do |k,v|
k_arr << k.inspect
end
f.puts k_arr.join(",")
end
row_arr = []
row.each do |k,v|
v ||= ""
v_enc = v.inspect
row_arr << v_enc
end
f.puts row_arr.join(",")
end
end
end
def puts_db_json(f,db_name,table_name)
conn = PG.connect( dbname: db_name )
conn.exec( "SELECT * FROM #{table_name}" ) do |result|
results = []
result.each_with_index do |row, i|
results.push(row)
end
f.puts JSON.pretty_generate(results)
end
end
def puts_db_yml(f,db_name,table_name)
conn = PG.connect( dbname: db_name )
conn.exec( "SELECT * FROM #{table_name}" ) do |result|
results = []
result.each_with_index do |row, i|
results.push(row)
end
f.puts YAML.dump(results)
end
end
def export_db_format(format, db_name,table_name)
output_file_name = "#{db_name}_#{table_name}.#{format.to_s}"
open(output_file_name,"wt") do |f|
func_name = "puts_db_#{format.to_s}"
send(func_name, f, db_name, table_name)
end
end
# 3formatまとめて出力
db_attrs.each do |db_name, table_names|
table_names.each do |table_name|
export_db_format(:csv, db_name, table_name)
export_db_format(:json, db_name, table_name)
export_db_format(:yml, db_name, table_name)
end
end