Saya ingin mengimpor data dari file CSV ke tabel database yang ada. Saya tidak ingin menyimpan file CSV, cukup ambil datanya dan masukkan ke tabel yang ada. Saya menggunakan Ruby 1.9.2 dan Rails 3.
Ini meja saya:
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
Bisakah Anda memberi saya beberapa kode untuk menunjukkan kepada saya cara terbaik untuk melakukan ini, terima kasih.
ruby-on-rails
csv
import
segar
sumber
sumber
Versi sederhana dari jawaban yfeldblum, yaitu lebih sederhana dan berfungsi dengan baik juga dengan file besar:
Tidak perlu dengan with_indifferent_access atau symbolize_keys, dan tidak perlu membaca file ke string terlebih dahulu.
Itu tidak menyimpan seluruh file dalam memori sekaligus, tetapi membaca baris demi baris dan membuat Molding per baris.
sumber
The
smarter_csv
permata secara khusus diciptakan untuk digunakan-hal ini: untuk membaca data dari file CSV dan cepat membuat entri database.Anda dapat menggunakan opsi
chunk_size
untuk membaca N csv-rows pada satu waktu, dan kemudian menggunakan Resque di loop dalam untuk menghasilkan pekerjaan yang akan membuat catatan baru, daripada membuatnya segera - dengan cara ini Anda dapat menyebarkan beban entri yang menghasilkan ke beberapa pekerja.Lihat juga: https://github.com/tilo/smarter_csv
sumber
Anda mungkin mencoba
Upsert
:Jika ini yang Anda inginkan, Anda mungkin juga mempertimbangkan untuk menyingkirkan kunci primer kenaikan-otomatis dari tabel dan mengatur kunci primer ke
name
. Atau, jika ada beberapa kombinasi atribut yang membentuk kunci utama, gunakan itu sebagai pemilih. Tidak diperlukan indeks, itu hanya akan membuatnya lebih cepat.sumber
Ini bisa membantu. Ini memiliki contoh kode juga:
http://csv-mapper.rubyforge.org/
Atau untuk tugas menyapu untuk melakukan hal yang sama:
http://erikonrails.snowedin.net/?p=212
sumber
Lebih baik untuk membungkus proses terkait database di dalam
transaction
blok. Pukulan cuplikan kode adalah proses penuh penyemaian serangkaian bahasa ke model Bahasa,Cuplikan di bawah ini adalah sebagian
languages.csv
file,sumber
Gunakan permata ini: https://rubygems.org/gems/active_record_importer
Maka sekarang Anda dapat menggunakan:
Pastikan bahwa tajuk Anda cocok dengan nama kolom pada tabel Anda
sumber
Cara yang lebih baik adalah memasukkannya dalam tugas menyapu. Buat file import.rake di dalam / lib / task / dan masukkan kode ini ke file itu.
Setelah itu jalankan perintah ini di terminal Anda
rake csv_model_import[file.csv,Name_of_the_Model]
sumber
Saya tahu ini pertanyaan lama tetapi masih di 10 tautan pertama di google.
Sangat tidak efisien untuk menyimpan baris satu per satu karena menyebabkan panggilan basis data dalam loop dan Anda lebih baik menghindarinya, terutama ketika Anda perlu memasukkan bagian data yang sangat besar.
Lebih baik (dan secara signifikan lebih cepat) untuk menggunakan bets insert.
Anda dapat membuat kueri seperti itu secara manual dan daripada melakukan
Model.connection.execute(RAW SQL STRING)
(tidak direkomendasikan) atau menggunakan permataactiverecord-import
(pertama kali dirilis pada 11 Agustus 2010) dalam hal ini hanya memasukkan data dalam arrayrows
dan panggilanModel.import rows
lihat dokumentasi permata untuk detailnya
sumber
Lebih baik menggunakan CSV :: Table dan gunakan
String.encode(universal_newline: true)
. Ini mengubah CRLF dan CR ke LFsumber
Jika Anda ingin Menggunakan SmartCSV
Ini mewakili data yang dibatasi tab di setiap baris
"\t"
dengan baris yang dipisahkan oleh baris baru"\n"
sumber