Chciałbym zaimportować dane z pliku CSV do istniejącej tabeli bazy danych. Nie chcę zapisywać pliku CSV, po prostu weź dane z niego i umieść w istniejącej tabeli. Używam Ruby 1.9.2 i Rails 3.
To jest mój stół:
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
Czy możesz dać mi kod, który pokaże mi najlepszy sposób, dzięki.
ruby-on-rails
csv
import
najświeższe
źródło
źródło
Prostsza wersja odpowiedzi yfeldblum, która jest prostsza i działa również z dużymi plikami:
Nie ma potrzeby korzystania z opcji_indifferent_access lub symbolize_keys i nie trzeba najpierw wczytywać pliku do ciągu.
Nie zachowuje jednocześnie całego pliku w pamięci, ale czyta wiersz po wierszu i tworzy profil na linię.
źródło
smarter_csv
Klejnot został stworzony specjalnie dla tej przypadków użycia: aby odczytać dane z pliku CSV i szybko tworzyć wpisy bazy danych.Możesz użyć opcji
chunk_size
odczytu N wierszy csv naraz, a następnie użyć Resque w wewnętrznej pętli, aby wygenerować zadania, które utworzą nowe rekordy, zamiast tworzyć je od razu - w ten sposób możesz rozłożyć obciążenie generowaniem wpisów do wielu pracowników.Zobacz także: https://github.com/tilo/smarter_csv
źródło
Możesz spróbować
Upsert
:Jeśli tego właśnie chcesz, możesz również rozważyć pozbycie się klucza podstawowego z automatycznym przyrostem z tabeli i ustawienie klucza podstawowego na
name
. Alternatywnie, jeśli istnieje kombinacja atrybutów, które tworzą klucz podstawowy, użyj tego jako selektora. Nie jest wymagany indeks, po prostu przyspieszy.źródło
To może pomóc. Zawiera również przykłady kodu:
http://csv-mapper.rubyforge.org/
Lub dla zadania prowizji za zrobienie tego samego:
http://erikonrails.snowedin.net/?p=212
źródło
Lepiej jest owinąć proces związany z bazą danych wewnątrz
transaction
bloku. Uderzenie fragmentu kodu to pełny proces zapełniania zestawu języków do modelu językowego,Poniższy fragment jest fragmentem
languages.csv
pliku,źródło
Użyj tego klejnotu: https://rubygems.org/gems/active_record_importer
Następnie możesz teraz użyć:
Upewnij się tylko, że nagłówki pasują do nazw kolumn tabeli
źródło
Lepszym sposobem jest włączenie go do zadania prowizji. Utwórz plik import.rake w / lib / task / i umieść ten kod w tym pliku.
Następnie uruchom to polecenie w swoim terminalu
rake csv_model_import[file.csv,Name_of_the_Model]
źródło
Wiem, że to stare pytanie, ale wciąż w pierwszych 10 linkach w Google.
Zapisywanie wierszy jeden po drugim nie jest zbyt wydajne, ponieważ powoduje wywołanie bazy danych w pętli i lepiej tego unikać, szczególnie gdy trzeba wstawić duże porcje danych.
Lepiej (i znacznie szybciej) jest używać wstawki wsadowej.
Możesz zbudować takie zapytanie ręcznie, a potem
Model.connection.execute(RAW SQL STRING)
nie (nie zalecane) lub użyć gemactiverecord-import
(został wydany po raz pierwszy 11 sierpnia 2010 r.) W tym przypadku po prostu umieść dane w tablicyrows
i wywołajModel.import rows
szczegółowe informacje można znaleźć w dokumentacji klejnotów
źródło
Lepiej jest używać CSV :: Tabela i używać
String.encode(universal_newline: true)
. Konwertuje CRLF i CR na LFźródło
Jeśli chcesz użyć SmartCSV
To reprezentuje dane rozdzielane tabulatorami w każdym wierszu
"\t"
z wierszami oddzielonymi nowymi wierszami"\n"
źródło