LoginSignup
3
2

More than 5 years have passed since last update.

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

Posted at

エラー処理、大規模のものについての対応は特にしていません。
あまり綺麗ではない。
とりあえず、開発準備用

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2