インポートするレコードが多い場合は、MySQL のローダーを使用することをお勧めします。非常に高速になります。
LOAD DATA INFILE を使用して、外部ソースから取得したファイルを読み取ることができます。たとえば、多くのプログラムは、データをカンマ区切り値 (CSV) 形式でエクスポートできます。この形式では、行にフィールドがカンマで区切られ、二重引用符で囲まれ、列名の最初の行が含まれます。このようなファイルの行がキャリッジ リターン/改行のペアで終了している場合、次に示すステートメントは、ファイルをロードするために使用するフィールドおよび行処理オプションを示しています。
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
入力値が必ずしも引用符で囲まれているとは限らない場合は、ENCLOSED BY キーワードの前に OPTIONALLY を使用してください。
それを使用してすべてを一時テーブルにプルし、次に ActiveRecord を使用してクエリを実行し、不要なレコードを削除してから、一時テーブルから本番テーブルにコピーしてから、一時テーブルを削除または切り捨てます。または、ActiveRecord を使用して一時テーブルを検索し、レコードを本番環境にコピーしてから、一時テーブルを削除または切り捨てます。MySQL 内でテーブルからテーブルへのコピーを実行したり、あるテーブルを別のテーブルに追加したりすることもできます。
専用ローダーの速度に勝るものはなく、データベースのクエリ メカニズムを使用してレコードを一括処理するのは難しいでしょう。CSV ファイルのレコードをオブジェクトに変換し、ORM を使用してそれをデータベースに書き込むステップは、余分なオーバーヘッドを追加するため、Ruby のロジックを必要とする非常に難しい検証がない限り、直進する方が速くなります。データベースに。
編集: これは、単純な CSV ヘッダーから DB 列マッパーへの例です。
require "csv"
data = <<EOT
header1, header2, header 3
1, 2, 3
2, 2, 3
3, 2, 3
EOT
header_to_table_columns = {
'header1' => 'col1',
'header2' => 'col2',
'header 3' => 'col3'
}
arr_of_arrs = CSV.parse(data)
headers = arr_of_arrs.shift.map{ |i| i.strip }
db_cols = header_to_table_columns.values_at(*headers)
arr_of_arrs.each do |ary|
# insert into the database using an ORM or by creating insert statements
end