質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

本番環境へのデータの流し方

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,214

renren643

score 243

railsでアプリ(rails_appフォルダとする)を作っており、そこに別フォルダ(rails_insertフォルダとする)からデータを流し込んでいます。

rails insertフォルダ内のinsert.rb内に以下の処理を書いてruby insert.rbを実行するとrails_appフォルダにデータが流し込まれるのですが、これはローカル環境なんです。

本番環境にデータを流し込むためには
cur = cur + "/../rails_app/db/development.sqlite3を変えなくてはいけないとおもうのでが、
どのようにしたらいいのでしょうか?

ちなみにherokuで運用しており、DBはpostgresqlです。

↓rails insertフォルダ内のinsert.rb

:
:
:
:
def insert(all)
          cur = File.expand_path(File.dirname(File.dirname(__FILE__)))
          cur = cur + "/../rails_app/db/development.sqlite3"
          db = SQLite3::Database.new(cur)
          all.each do |a|
            title = a[:title]
            url = a[:url]
            image = a[:image]
            db.execute('insert into articles ("title" ,"url","created_at","updated_at","image") values (?,?,?,?,?)', "#{title}","#{url}",'2018-03-22 21:00:00','2018-03-22 21:00:00',"#{image}")
end

:
:
:
:

config/database.yml

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  adapter: sqlite3
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  adapter: sqlite3
  database: db/test.sqlite3

 production:
   <<: *default
   adapter: postgresql
   database: db/production.sqlite3 

ここを参考に以下のように変更して見ましたが、
「could not connect to server: No such file or directory (PG::ConnectionBad)」と出ます。

def insert(all)
          cur = File.expand_path(File.dirname(File.dirname(__FILE__)))
            cur = cur + "/../rails_app/db/production.sqlite3"

          db = PG::connect(cur)
          all.each do |a|
            title = a[:title]
            url = a[:url]
            image = a[:image]
            db.exec('insert into articles (title,url,created_at,updated_at,image) values (?,?,?,?,?)', '#{title}','#{url}','2018-03-22 21:00:00','2018-03-22 21:00:00','#{image}')
          end
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

余談ですが、開発環境と本番環境では同じDBを使ったほうがいいと思うんですよね。
本番環境がPostgreSQLなら開発環境もPostgreSQLが良いです。
あくまでもおすすめレベルなので、面倒だったら無理に変える必要はないです。

本題ですが、環境に左右されないように投入するデータはテキスト形式(CSV、TSV、JSONなど)で用意しておいて、Railsのモデルを使って登録する方法がいいと思います。
実際、私はそうしています。

JSONでデータを用意する方法を説明すると、こんな感じです。
コードは動作確認していないのでタイプミスとかあるかもしれませんが、流れを分かってもらえれば十分だと思います。

 開発環境でデータを用意する

例えば、こんな感じのJSONを用意します。

data/import.json

[
  {
    "title": "タイトル",
    "url": "http://~",
    "image": "画像",
  },
  ...
] 

もちろん手動で作るのではなくて、プログラムで作成します。
今回は開発環境のDBに登録した内容を使いたいという事ですよね?
既にDBにレコードがあるので、普通に検索してJSON形式の文字列に変換してファイルに保存します。

置き場所はどこでもいいですが、ここではbatch/export_data.rbとします。

rows = []
Article.all.each do |article|
  rows << {
    title: article.title,
    url: article.url,
    image: article.image
  }
end

output_file = "#{Rails.root}/data/import.json"
File.open(output_file, "w:utf-8"){|f|
  f.print rows.to_json
}
puts "save to #{output_file}"

実行しましょう。data/import.jsonが作られますので、本番環境へ持って行きます。
バージョン管理しているなら、コミットしておきましょう。

bin/rails runner batch/export_data.rb

 本番環境でデータを投入する

JSONができればどこの環境でもモデルを使って登録できます。

ファイルの置き場所はどこでもいいですが、
batch/import.rb など適当な場所においてコミットしておきます。

data_file = "#{Rails.root}/data/import.json"
unless File.exist?(data_file)
  puts "file not exist: #{data_file}"
  exit
end

json_str = File.read(data_file, encoding: 'utf-8')
rows = JSON.parse(json_str)

# データを全部消す
Article.destroy_all
# データを新規登録する
rows.each do |row|
  article = Article.create!(row.symbolize_keys)
  puts "article created: #{article.inspect}"
end

本番環境で実行しましょう。
環境変数RAILS_ENV=productionが設定してあるものとします。

bin/rails runner batch/import.rb

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/31 11:31

    回答ありがとうございます。
    「開発環境と本番環境では同じDBを使ったほうがいいと思うんですよね。」これは今回実感しました。今度からは一緒にしようと強くおもっています。

    jsonを使ったやり方も教えていただきありがとうございます。
    そっちでもやって見たいと思いますが、私の性格上、今やっていることを解決せずに違う方法をやるのはモヤモヤするため、まずは開発環境でやってきたやり方と同じやり方で解決してからやってみようと思います。

    キャンセル

0

rails_appフォルダにデータが流し込まれる

SQLiteの格納フォルダが/../rails_app/db/development.sqlite3なので、insertにより追加されています。

ですが、それはあくまでSQLiteの設定で、本番DBの設定はまた別です。
何処に格納されるかは気にしなくて良く、接続先を本番DBに変更するだけです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/31 11:27

    回答ありがとうございます。
    「接続先を本番DBに変更するだけです。」と言うのは「/../rails_app/db/development.sqlite3」の記述を変えると言うことですよね?「/../rails_app/db/production.sqlite3」と言う ことでしょうか?

    キャンセル

  • 2018/03/31 11:33 編集

    db以下にproduction.sqlite3が作成されていないので、上記のやり方は違うと思いますが、やり方をもう少し詳しくお聞きしてもよろしいでしょうか?

    キャンセル

  • 2018/03/31 11:36

    database.ymlの記述も追記しました。

    キャンセル

  • 2018/03/31 16:19 編集

    「接続先を本番DBに変更するだけ」というのは語弊があったかもしれません。
    rails には詳しくないので、「rails postgres 接続」などでググって下さい。
    以下参考
    https://www.oiax.jp/rails3book/setup_postgresql.html

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる