Rails アプリ内からデータベース (私の場合は POSTGRES) に数千のレコードをバッチ挿入したいと考えています。
それを行う「Railsの方法」は何でしょうか? それを行うための高速で正しい方法です。
属性の文字列連結によって SQL クエリを作成できることはわかっていますが、より良いアプローチが必要です。
Rails アプリ内からデータベース (私の場合は POSTGRES) に数千のレコードをバッチ挿入したいと考えています。
それを行う「Railsの方法」は何でしょうか? それを行うための高速で正しい方法です。
属性の文字列連結によって SQL クエリを作成できることはわかっていますが、より良いアプローチが必要です。
@Simone Carlettiと@Sumit Munotの2つの回答の後、最終的に解決策に達しました。
postgres ドライバーが ActiveRecord .create メソッドの一括挿入をサポートするまでは、 activerecord-import gemを使いたいと思います。一括挿入を行い、それも単一の挿入ステートメントで行います。
books = []
10.times do |i|
books << Book.new(:name => "book #{i}")
end
Book.import books
POSTGRES では、単一の挿入ステートメントにつながります。
postgres ドライバーが単一の挿入ステートメントで ActiveRecord .create メソッドの一括挿入をサポートすると、@Simone Carletti のソリューションがより理にかなっています:)
Railsモデルでスクリプトを作成し、そのスクリプトに挿入するクエリを記述できます。レールでは、次を使用してスクリプトを実行できます
rails runner MyModelName.my_method_name
私のプロジェクトで使用した最良の方法です。
アップデート:
私は自分のプロジェクトで以下を使用していますが、SQL インジェクションには適していません。このクエリでユーザー入力を使用していない場合は、うまくいく可能性があります
user_string = " ('a@ao.in','a'), ('b@ao.in','b')"
User.connection.insert("INSERT INTO users (email, name) VALUES"+user_string)
複数のレコードの場合:
new_records = [
{:column => 'value', :column2 => 'value'},
{:column => 'value', :column2 => 'value'}
]
MyModel.create(new_records)
高速な方法でも Rails の方法でも実行できます ;) 私の経験では、大量のデータを Postgres にインポートする最良の方法は CSV を使用することです。Postgres のネイティブ CSV インポート機能を使用すると、Rails の場合は数秒かかりますが、数分かかります。
http://www.postgresql.org/docs/9.2/static/sql-copy.html
さらに、データベース トリガーをトリガーし、データベースの制約を尊重します。
編集(コメント後):ガッチャ。その場合、2 つのオプションを正しく説明しています。Rails 1000 save を使用して実装した前に同じ状況になりました! それが機能する最も単純な方法だったので、戦略を最適化し、パフォーマンスが桁違いに優れていたため、「巨大なクエリ文字列を追加する」戦略に最適化しました。
もちろん、時期尚早の最適化は諸悪の根源であるため、単純で遅い Rails の方法で実行し、大きなクエリ文字列を構築することは、保守性を犠牲にして最適化するための完全に正当な手法であることを理解してください。あなたの本当の質問は、「何千ものクエリを必要としない Railsy の方法はありますか?」ということだと思います。- 残念ながら、それに対する答えはノーです。