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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

493閲覧

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

renren643

総合スコア279

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/03/30 14:51

編集2022/01/12 10:55

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

投稿2018/03/31 02:08

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

renren643

2018/03/31 02:27

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

2018/03/31 02:33 編集

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

2018/03/31 02:36

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

2018/03/31 07:20 編集

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

0

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

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

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

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

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

data/import.json

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

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

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

ruby

1rows = [] 2Article.all.each do |article| 3 rows << { 4 title: article.title, 5 url: article.url, 6 image: article.image 7 } 8end 9 10output_file = "#{Rails.root}/data/import.json" 11File.open(output_file, "w:utf-8"){|f| 12 f.print rows.to_json 13} 14puts "save to #{output_file}"

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

bin/rails runner batch/export_data.rb

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

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

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

ruby

1data_file = "#{Rails.root}/data/import.json" 2unless File.exist?(data_file) 3 puts "file not exist: #{data_file}" 4 exit 5end 6 7json_str = File.read(data_file, encoding: 'utf-8') 8rows = JSON.parse(json_str) 9 10# データを全部消す 11Article.destroy_all 12# データを新規登録する 13rows.each do |row| 14 article = Article.create!(row.symbolize_keys) 15 puts "article created: #{article.inspect}" 16end

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

bin/rails runner batch/import.rb

投稿2018/03/30 23:19

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

renren643

2018/03/31 02:31

回答ありがとうございます。 「開発環境と本番環境では同じDBを使ったほうがいいと思うんですよね。」これは今回実感しました。今度からは一緒にしようと強くおもっています。 jsonを使ったやり方も教えていただきありがとうございます。 そっちでもやって見たいと思いますが、私の性格上、今やっていることを解決せずに違う方法をやるのはモヤモヤするため、まずは開発環境でやってきたやり方と同じやり方で解決してからやってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問