2017-06-29 19 views
0

別のMySQLデータベースからRails ActiveRecordで一括挿入しようとしています。私のデータベースはPostgresです。Railsで一括挿入中にエラーが発生しました

は、次のコードと宝石bulk_insert使用される:

batch,batch_size = [], 1_000 
records.each do |row| 
    batch << params 
    if batch.size >= batch_size 
     TableName.bulk_insert values: batch 
     batch = [] 
    end 
end 

をしかし、そうしようとしたときに、私はエラーを取得しています。最初の1000レコードが正常に挿入されます。その後、次のようになります。

from /var/lib/gems/2.3.0/gems/activerecord-5.0.3/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `async_exec' 
from /var/lib/gems/2.3.0/gems/activerecord-5.0.3/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `block in execute' 
from /var/lib/gems/2.3.0/gems/activerecord-5.0.3/lib/active_record/connection_adapters/abstract_adapter.rb:590:in `block in log' 
from /var/lib/gems/2.3.0/gems/activesupport-5.0.3/lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
from /var/lib/gems/2.3.0/gems/activerecord-5.0.3/lib/active_record/connection_adapters/abstract_adapter.rb:583:in `log' 
from /var/lib/gems/2.3.0/gems/activerecord-5.0.3/lib/active_record/connection_adapters/postgresql/database_statements.rb:97:in `execute' 
from /var/lib/gems/2.3.0/gems/bulk_insert-1.5.0/lib/bulk_insert/worker.rb:78:in `block in save!' 
from /var/lib/gems/2.3.0/gems/bulk_insert-1.5.0/lib/bulk_insert/worker.rb:78:in `tap' 
from /var/lib/gems/2.3.0/gems/bulk_insert-1.5.0/lib/bulk_insert/worker.rb:78:in `save!' 
from /var/lib/gems/2.3.0/gems/bulk_insert-1.5.0/lib/bulk_insert/worker.rb:40:in `add' 
from /var/lib/gems/2.3.0/gems/bulk_insert-1.5.0/lib/bulk_insert/worker.rb:63:in `block in add_all' 
from /var/lib/gems/2.3.0/gems/bulk_insert-1.5.0/lib/bulk_insert/worker.rb:63:in `each' 
from /var/lib/gems/2.3.0/gems/bulk_insert-1.5.0/lib/bulk_insert/worker.rb:63:in `add_all' 
from /var/lib/gems/2.3.0/gems/bulk_insert-1.5.0/lib/bulk_insert.rb:13:in `block in bulk_insert' 
from /var/lib/gems/2.3.0/gems/activerecord-5.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction' 
from /var/lib/gems/2.3.0/gems/activerecord-5.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction' 
... 22 levels... 
from /var/lib/gems/2.3.0/gems/railties-5.0.3/lib/rails/commands/console_helper.rb:9:in `start' 
from /var/lib/gems/2.3.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:78:in `console' 
from /var/lib/gems/2.3.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
from /var/lib/gems/2.3.0/gems/railties-5.0.3/lib/rails/commands.rb:18:in `<top (required)>' 
from /var/lib/gems/2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:293:in `require' 
from /var/lib/gems/2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:293:in `block in require' 
from /var/lib/gems/2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:259:in `load_dependency' 
from /var/lib/gems/2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:293:in `require' 
from /home/user/rails-app/bin/rails:9:in `<top (required)>' 
from /var/lib/gems/2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:287:in `load' 
from /var/lib/gems/2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:287:in `block in load' 
from /var/lib/gems/2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:259:in `load_dependency' 
from /var/lib/gems/2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:287:in `load' 
from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
from -e:1:in `<main>' 

レコードのサイズは約100,000です。これらの数のレコードをRailsテーブルに挿入する最良の方法は何でしょうか?

何か間違っていますか?

+0

this

をお読みください - csvファイルから、あるいは接続を介して:http://www.kadrmasconcepts.com/blog/2013/12/15/copy-millions-ofrows-to-postgresql-with-rails/ –

+0

私は別のデータベースからデータを取得し、次に挿入する必要がありますRailsテーブル。これを達成する最良の方法は何ですか? –

+0

あなたはその情報であなたの質問を始めなければなりませんでした。 https://stackoverflow.com/questions/36476192/postgresql-copy-transfer-data-from-one-database-to-another –

答えて

0

私はあなたのActiveRecordのインポートライブラリ を利用することができます推測PostgreSQLの一括挿入するための最良の方法は、その `COPY`コマンドを使用することです。このbulk_insert

+0

使用されているbulk_insertですが、私が必要とするのは多少find_or_create_byメソッドです。これはbulk_insertを通して行うことができますか?現在、bulk_insertを実行していて、重複レコードを削除しています。これは確かに正しい方法ではありません。 –

関連する問題