Я хотел бы импортировать данные из файла CSV в существующую таблицу базы данных. Я не хочу сохранять файл CSV, просто возьмите данные из него и поместите их в существующую таблицу. Я использую Ruby 1.9.2 и Rails 3.
Это мой стол:
create_table "mouldings", :force => true do |t|
t.string "suppliers_code"
t.datetime "created_at"
t.datetime "updated_at"
t.string "name"
t.integer "supplier_id"
t.decimal "length", :precision => 3, :scale => 2
t.decimal "cost", :precision => 4, :scale => 2
t.integer "width"
t.integer "depth"
end
Можете ли вы дать мне код, чтобы показать мне лучший способ сделать это, спасибо.
ruby-on-rails
csv
import
свежайшие
источник
источник
Более простая версия ответа yfeldblum, более простая и хорошо работающая также с большими файлами:
Нет необходимости в with_indifferent_access или symbolize_keys, и нет необходимости сначала читать файл в строку.
Он не хранит весь файл в памяти сразу, но читает построчно и создает Формирование каждой строки.
источник
smarter_csv
Камень был специально создан для этого сценария использования: для чтения данных из CSV - файла и быстро создавать записи в базе данных.Вы можете использовать опцию
chunk_size
для одновременного чтения N csv-строк, а затем использовать Resque во внутреннем цикле для генерации заданий, которые будут создавать новые записи, а не создавать их сразу - таким образом вы можете распределить нагрузку по генерации записей. нескольким работникам.Смотрите также: https://github.com/tilo/smarter_csv
источник
Вы можете попробовать
Upsert
:Если это то, что вам нужно, вы можете также рассмотреть возможность избавиться от первичного ключа с автоинкрементом из таблицы и установить первичный ключ в значение
name
. Альтернативно, если есть некоторая комбинация атрибутов, которые формируют первичный ключ, используйте это как селектор. Индекс не нужен, он просто сделает это быстрее.источник
Это может помочь. Также есть примеры кода:
http://csv-mapper.rubyforge.org/
Или для граблей для того же:
http://erikonrails.snowedin.net/?p=212
источник
Лучше обернуть процесс, связанный с базой данных, внутри
transaction
блока. Удар по фрагменту кода - это полный процесс заполнения набора языков для языковой модели,Ниже приведен фрагмент
languages.csv
файла,источник
Используйте этот драгоценный камень: https://rubygems.org/gems/active_record_importer
Тогда вы можете теперь использовать:
Просто убедитесь, что ваши заголовки соответствуют именам столбцов вашей таблицы
источник
Лучше всего включить его в задание на грабли. Создайте файл import.rake внутри / lib / tasks / и поместите этот код в этот файл.
После этого запустите эту команду в вашем терминале
rake csv_model_import[file.csv,Name_of_the_Model]
источник
Я знаю, что это старый вопрос, но он все еще в первых 10 ссылках в Google.
Не очень эффективно сохранять строки по одной, потому что это вызывает вызов базы данных в цикле, и вам лучше этого избежать, особенно когда вам нужно вставить огромные порции данных.
Лучше (и значительно быстрее) использовать пакетную вставку.
Вы можете создать такой запрос вручную, а затем
Model.connection.execute(RAW SQL STRING)
(не рекомендуется) или использовать gemactiverecord-import
(он был впервые выпущен 11 августа 2010 г.), в этом случае просто поместить данные в массивrows
и вызватьModel.import rows
обратитесь к документации по драгоценным камням для деталей
источник
Лучше использовать CSV :: Table и использовать
String.encode(universal_newline: true)
. Это преобразование CRLF и CR в LFисточник
Если вы хотите использовать SmartCSV
Это представляет данные с разделителями табуляции в каждой строке
"\t"
со строками, разделенными новыми строками"\n"
источник