Если вам нужно импортировать много записей, вы можете использовать файлы 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.
Используйте это, чтобы вытащить все во временную таблицу, затем используйте ActiveRecord для выполнения запросов к ней, чтобы удалить записи, которые вам не нужны, затем скопируйте из временной таблицы в рабочую, затем удалите или усеките временную. Или используйте ActiveRecord для поиска во временной таблице и копирования записей в рабочую среду, а затем удалите или усеките временную таблицу. Возможно, вы даже сможете сделать копию таблицы в таблицу внутри MySQL или добавить одну таблицу к другой.
Будет сложно превзойти скорость выделенного загрузчика и использовать механизм запросов базы данных для массовой обработки записей. Шаг превращения записи в файле CSV в объект, а затем использование ORM для записи ее в базу данных добавляет много дополнительных накладных расходов, поэтому, если у вас нет сверхсложных проверок, требующих логики Ruby, вы будете быстрее идти прямо в базу данных.
РЕДАКТИРОВАТЬ: Вот простой пример отображения заголовка 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
person
the Tin Man
schedule
06.12.2010