2017-08-09 3 views
1

私のアプリケーションではCityモデルがあります。私はsqlファイルを持っています。(それ以上の2.7M) &私はそれらをすべて私のプロダクションサーバに植え付ける必要があります。Ruby on Rails - 大量のデータ(2.7M以上)を生産データベースにシードする

私は通常、私はseeds.rbでこれを行うことができます知っている:

cities = City.create([ 

{id: 1, name: 'Bombuflat', state_id: 1}, 
{id: 2, name: 'Garacharma', state_id: 1}, 
{id: 3, name: 'Port Blair', state_id: 1}, 
// Other cities 
]) 

しかし、これはシードするビッグデータであるので、各ライン上idnamestate_idを追加するために、本当に長い時間がかかります。

は今のところ私のcities.sqlは、のような都市の配列を持っています

//id, state_id, name 
(1, 1, 'Aixàs'), 
(2, 1, 'Aixirivali'), 
(3, 1, 'Aixirivall') 

ので、私は使っ多分各行にidnamestate_idを追加する必要はありませんこれは何を行うための最善の方法です私はすでに持っている配列。

unless Rails.env.production? 
    connection = ActiveRecord::Base.connection 


    sql = File.read('db/MySQL.sql') 
    statements = sql.split(/;$/) 
    statements.pop 

    ActiveRecord::Base.transaction do 
    statements.each do |statement| 
     connection.execute(statement) 
    end 
    end 
end 
+1

RailsでSQLをプロダクションDBにダンプしないのはなぜですか? – Bustikiller

+2

正直私は、この量のデータを、シード目的のためにActiveRecordに挿入する必要はないと思います。ツールを使用して、データをデータベースに一括して挿入します。 MySQLの 'LOAD DATA INFILE'は、わずかなパワーのデータベースを使って数秒でそれを行うことができます。 – vcsjones

+1

@Bustikiller私の制作で私はpostgresqlを使用しています –

答えて

0

はこのような何かを行います。 COPYPostgreSQLです。 COPYは、INSERTよりはるかに高速です。

したがって、CSVのファイルには、列名(id、name、stated_id)に対応するヘッダーが必要です。 COPYでPostgreSQL DBから取得することもできます。

cities.csvとし、dbフォルダに置きます。そして、rake db:seedを実行

csv_path = Rails.root.join('db', 'cities.csv') 
copy_clause = "COPY cities FROM '#{csv_path}' WITH(FORMAT CSV, HEADER)" 
ActiveRecord::Base.connection.execute(copy_clause) 

:次に、あなたのseeds.rbは、次のようになります。

0

大きなDBMSのほとんどは、バルク播種のためにコマンドを使用してSQLを拡張:たとえば

関連する問題