Ruby
PostgreSQL
JSON
CSV
YAML

PostgreSQL の各テーブルを丸ごと CSV,YAML,JSON 化してしまう

More than 3 years have passed since last update.

エラー処理、大規模のものについての対応は特にしていません。

あまり綺麗ではない。

とりあえず、開発準備用


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