Androidはワンツーパンチ 三歩進んで二歩下がる

プログラミングやどうでもいい話

Railsでcsvファイルから初期データを投入する

Railsを勉強中です。

csvファイルから初期データをDBに投入し、画面に表示するという一連の処理をメモします。
railsのバージョンは4.2.6です。

サンプルのアプリケーションを新しく作ります。

$ rails new exm-csv-import

このようなデータを投入します。
f:id:sakura_bird1:20170226212023p:plain


モデルを生成します。

$ rails g model PostalCode local_goverment_code:integer postal_code_old:integer postal_code:integer prefecture_katakana:string ward_katakana:string town_katakana:string prefecture:string ward:string town:string

dbフォルダの下にcsvファイルをコピーします。

db/seeds.rbを次のように編集します。
ここでは、csvファイルにカラム名を記述したヘッダー有りの場合と無しの場合次のようになります。

ヘッダー有りのcsv
f:id:sakura_bird1:20170226213302p:plain

ヘッダー有り

require 'csv'

csv_data = CSV.read('db/postal_code_tokyo_with_header.csv', headers: true)
csv_data.each do |data|
  PostalCode.create!(data.to_hash)
end


ヘッダー無し

require 'csv'

CSV.foreach('db/postal_code_tokyo_seed_no_header.csv') do |row|
  PostalCode.create(:local_goverment_code => row[0],
                    :postal_code_old => row[1],
                    :postal_code => row[2],
                    :prefecture_katakana => row[3],
                    :ward_katakana => row[4],
                    :town_katakana => row[5],
                    :prefecture => row[6],
                    :ward => row[7],
                    :town => row[8])
end

db:migrateをまだ行ってないので実行してから、rake db:seedを実行します。

$ rake db:migrate
$ rake db:seed

これでcsvファイルからテーブルにデータが投入されました。
確認します。

sqliteのコマンドを起動し開発用Databaseに入ります。

sqlite3 db/development.sqlite3
ちなみに
sqlite> .tables
とするとテーブル一覧が表示されます。
postal_codes       schema_migrations


sqlite> .schema postal_codes;
とするとスキーマが表示されます。

CREATE TABLE "postal_codes" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "local_goverment_code" integer, "postal_code_old" integer, "postal_code" integer, "prefecture_katakana" varchar, "ward_katakana" varchar, "town_katakana" varchar, "prefecture" varchar, "ward" varchar, "town" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
sqlite> select * from postal_codes

でテーブルの中身が表示されます。うまくできました。

f:id:sakura_bird1:20170226213806p:plain


このテーブルの一覧を画面に表示します。
コントローラを作成します。

$ rails g controller postal_codes

postal_codes_controller.rb に以下を追加します。

class PostalCodesController < ApplicationController

  # GET /postal_codes
  def index
    @postal_codes = PostalCode.all
  end

end

/app/views/postal_codes/ に index.html.erb を追加し、次のように記述します。

<h1>Listing Postal Codes</h1>

<table>
  <thead>
    <tr>
      <th>LocalGovermentCode</th>
      <th>PostalCodeOld</th>
      <th>PostalCode</th>
      <th>PrefectureKatakana</th>
      <th>WardKatakana</th>
      <th>TownKatakana</th>
      <th>Prefecture</th>
      <th>Ward</th>
      <th>Town</th>
    </tr>
  </thead>

  <tbody>
    <% @postal_codes.each do |postal_code| %>
      <tr>
        <td><%= postal_code.local_goverment_code %></td>
        <td><%= postal_code.postal_code_old %></td>
        <td><%= postal_code.postal_code %></td>
        <td><%= postal_code.prefecture_katakana %></td>
        <td><%= postal_code.ward_katakana %></td>
        <td><%= postal_code.town_katakana %></td>
        <td><%= postal_code.prefecture %></td>
        <td><%= postal_code.ward %></td>
        <td><%= postal_code.town %></td>
      </tr>
    <% end %>
  </tbody>
</table>


/config/routes.rb に以下を追加します。

Rails.application.routes.draw do
  resources :postal_codes
  (略)

rails s でローカルサーバーを起動します。

http://localhost:3000/postal_codes
にアクセスします。

このように表示されます。
f:id:sakura_bird1:20170226214503p:plain

以上です。