RubyOnRailsで作成したPostgresqlのTEMPTABLEに対して、JSONファイルから大量のデータ
をインサートしたいです。(何十万レコード)
この場合に、現在は以下のような実装をしています。
class controller def action # 一時テーブルをクリエイト TmpModel.create_tmp_table # jsonのデータをopen jsondata = File.open(params[:filepath]).read # to_jsonでpostgresにコピーできるようにしたもの json = JSON.parse(jsondata).to_json TmpModel.insert_tmp_table(json) end end
class TmpModel include ActiveModel::Model class <<self def create_tmp_table ActiveRecord::Base.connection.execute CREATE TEMP TABLE tmp_table( colum1 integer, column2 integer,... ) end def insert_tmp_table ActiveRecord::Base.connection.execute("INSERT INTO tmp_table ( column1, column2,...) SELECT column1, column2,... FROM json_populate_recordset( NULL::tmp,'#{json}')"") end end
読み込ませるjsonfile [ { column1: value, column2: value, ... }, { column1: value, column2: value, ... },... ]
この場合、発行されるSQLのFROM句に、insertされるレコードがズラーっと並んでしまうので、大量データをインサートする
際に、SQLステートメントの文字数制限や、パフォーマンスの点で問題があるかと思います。
そのため、可能であればJSONを元にpostgresにbulkinsertをしたいです。
Railsでデータベースにbulkinsertをする場合、「activerecord import」のようなgemを使用することが推奨されているようですが、今回は物理テーブルではなくTEMPテーブルのため、当gemは使用できませんでした。
他にJSONファイルを元に大量データのinsertをする方法があればご教示頂きたいです。
(現在は、JSONをCSVに変換して、PostgresのCOPYコマンドでCSVを読み込ませる方法を考えていますが、可能であればJSON形式のままbulkinsertしたいです。)
よろしくお願い致します。
RubyOnRails5
Postgresql9.6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。