Gostaria de importar dados de um arquivo CSV para uma tabela de banco de dados existente. Não quero salvar o arquivo CSV, basta pegar os dados e colocá-los na tabela existente. Estou usando o Ruby 1.9.2 e o Rails 3.
Esta é a minha mesa:
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
Você pode me dar algum código para me mostrar a melhor maneira de fazer isso, obrigado.
ruby-on-rails
csv
import
mais fresco
fonte
fonte
Versão mais simples da resposta de yfeldblum, que é mais simples e funciona bem também com arquivos grandes:
Não há necessidade de with_indifferent_access ou symbolize_keys e não há necessidade de ler o arquivo em uma sequência primeiro.
Ele não mantém o arquivo inteiro na memória de uma só vez, mas lê linha por linha e cria um Molding por linha.
fonte
A
smarter_csv
gem foi criada especificamente para este caso de uso: para ler dados do arquivo CSV e criar rapidamente entradas do banco de dados.Você pode usar a opção
chunk_size
de ler N linhas CSV por vez e, em seguida, usar Resque no loop interno para gerar tarefas que criarão os novos registros, em vez de criá-los imediatamente - dessa forma, você pode espalhar a carga de gerar entradas para vários trabalhadores.Veja também: https://github.com/tilo/smarter_csv
fonte
Você pode tentar
Upsert
:Se é isso que você deseja, considere também livrar-se da chave primária de incremento automático da tabela e definir a chave primária como
name
. Como alternativa, se houver alguma combinação de atributos que formam uma chave primária, use-a como seletor. Nenhum índice é necessário, apenas o tornará mais rápido.fonte
Isso pode ajudar. Também tem exemplos de código:
http://csv-mapper.rubyforge.org/
Ou para uma tarefa de rake por fazer o mesmo:
http://erikonrails.snowedin.net/?p=212
fonte
É melhor agrupar o processo relacionado ao banco de dados dentro de um
transaction
bloco. O sopro do snippet de código é um processo completo de propagação de um conjunto de idiomas para o modelo de idioma,O fragmento abaixo é uma parte do
languages.csv
arquivo,fonte
Use esta gema: https://rubygems.org/gems/active_record_importer
Agora você pode usar:
Apenas certifique-se de que seus cabeçalhos correspondam aos nomes das colunas da sua tabela
fonte
A melhor maneira é incluí-lo em uma tarefa de rake. Crie o arquivo import.rake dentro de / lib / tasks / e coloque esse código nesse arquivo.
Depois disso, execute este comando no seu terminal
rake csv_model_import[file.csv,Name_of_the_Model]
fonte
Eu sei que é pergunta antiga, mas ainda nos primeiros 10 links no google.
Não é muito eficiente salvar as linhas uma a uma, porque causa uma chamada ao banco de dados no loop e é melhor evitar isso, especialmente quando é necessário inserir grandes porções de dados.
É melhor (e significativamente mais rápido) usar a inserção em lote.
Você pode criar essa consulta manualmente e, em seguida, fazer
Model.connection.execute(RAW SQL STRING)
(não recomendado) ou usar gemactiverecord-import
(foi lançado em 11 de agosto de 2010). Nesse caso, basta colocar os dados na matrizrows
e chamarModel.import rows
consulte os documentos da gem para obter detalhes
fonte
É melhor usar CSV :: Table e usar
String.encode(universal_newline: true)
. Ele converte CRLF e CR em LFfonte
Se você deseja usar o SmartCSV
Isso representa dados delimitados por tabulação em cada linha
"\t"
com linhas separadas por novas linhas"\n"
fonte