ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

Heroku PostgresにSQLファイルを読み込ます

Heroku PostgresにはCSVファイルを挿入できないようなのでCSVファイルからinsert文のSQLファイルをつくる。
つくったSQLファイルをHeroku Postgresに読み込ませればレコードを挿入できる。

目次


前提条件

Heroku Postgresを操作するにはローカルにもPostgreSQLがインストールされている必要がある。
Heroku上でデータベースとテーブルの設定を済ましておく。

CSVファイル

今回のサンプル
sample.csv

2018,全日本大学選手権,男子エイト,1,Aクルー,05:55.91
2018,全日本大学選手権,男子エイト,2,Bクルー,06:00.70
2018,全日本大学選手権,男子エイト,3,Cクルー,06:01.04
2018,全日本大学選手権,男子エイト,4,Dクルー,06:03.31


Heroku Postgresのテーブル

テーブル名: samples

Column Type
id integer
year smallint
tournament_name character varying(20)
event_name character varying(20)
rank smallint
crew character varying(20)
goaltime character varying(10)

# idはserial primary key

CSVファイルをSQLファイルに変換するコード

rewrite.rb

require 'csv'

class Sqlwriter
    def initialize(csv_file, sql_file)
        @csv_file = csv_file
        @sql_file = sql_file
    end

    def rewrite
        txt = "insert into samples (year,tournament_name,event_name,rank,crew,goaltime) values \n"

        CSV.foreach(@csv_file) do |csv_file|
            txt << "(#{csv_file[0]},'#{csv_file[1]}','#{csv_file[2]}',#{csv_file[3]},'#{csv_file[4]}','#{csv_file[5]}'),\n"
        end
        txt.gsub!(/,\Z/,";")
        open(@sql_file,"w") do |sql_file|
            sql_file.write txt
        end
    end
end

Sqlwriter.new("sample.csv","sample.sql").rewrite


実行結果

rewrite.rbとsample.csvを同じディレクトリに置いて実行する。
実行結果は次のとおり。

sample.sql

insert into samples (year,tournament_name,event_name,rank,crew,goaltime) values 
(2018,'全日本大学選手権','男子エイト',1,'Aクルー','05:55.91'),
(2018,'全日本大学選手権','男子エイト',2,'Bクルー','06:00.70'),
(2018,'全日本大学選手権','男子エイト',3,'Cクルー','06:01.04'),
(2018,'全日本大学選手権','男子エイト',4,'Dクルー','06:03.31');


Heroku Postgres

Heroku PostgresのWebページ

Heroku Dev Center
Heroku Postgres

https://devcenter.heroku.com/articles/heroku-postgresql

Heroku PostgresにSQL文を読み込ます

Herokuにログインする前にターミナルのcdコマンドでsample.sqlファイルがある場所に移動しておく。
移動したらHerokuにログインする。

heroku login
#メールアドレスとパスワードが必要


Heroku Postgresにログインする。

heroku pg:psql --app [appname]
#[appname]は各自のアプリ名


SQLファイルを読み込ませてデータベースにレコードを挿入する。

\i sample.sql


SQLファイルの内容が実行されてレコードが挿入される。

Heroku Postgresからログアウトする。

\q


Herokuからログアウトする。

heroku logout


今回の動作確認環境

macOS 10.13.6
Ruby 2.5.1p57
PostgresSQL 10.3