如果您有很多要导入的记录,您可能需要使用MySQL 的 loader。这将非常快。
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 逻辑的超级困难的验证,否则您会更快地直接进行到数据库。
编辑:这是 DB 列映射器示例的简单 CSV 标题:
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