Je voudrais importer des données d'un fichier CSV dans une table de base de données existante. Je ne veux pas enregistrer le fichier CSV, il suffit de prendre les données et de les placer dans la table existante. J'utilise Ruby 1.9.2 et Rails 3.
Voici ma table:
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
Pouvez-vous me donner du code pour me montrer la meilleure façon de le faire, merci.
ruby-on-rails
csv
import
le plus frais
la source
la source
Version plus simple de la réponse de yfeldblum, qui est plus simple et fonctionne bien également avec des fichiers volumineux:
Pas besoin de with_indifferent_access ou symbolize_keys, et pas besoin de lire d'abord le fichier dans une chaîne.
Il ne conserve pas le fichier entier en mémoire à la fois, mais lit ligne par ligne et crée un moulage par ligne.
la source
Le
smarter_csv
bijou a été spécialement créé pour ce cas d'utilisation: pour lire les données du fichier CSV et créer rapidement des entrées de base de données.Vous pouvez utiliser l'option
chunk_size
pour lire N lignes csv à la fois, puis utiliser Resque dans la boucle interne pour générer des travaux qui créeront les nouveaux enregistrements, plutôt que de les créer immédiatement - de cette façon, vous pouvez répartir la charge de génération d'entrées à plusieurs travailleurs.Voir aussi: https://github.com/tilo/smarter_csv
la source
Vous pourriez essayer
Upsert
:Si c'est ce que vous voulez, vous pouvez également envisager de vous débarrasser de la clé primaire à incrémentation automatique de la table et de définir la clé primaire sur
name
. Sinon, s'il existe une combinaison d'attributs qui forment une clé primaire, utilisez-la comme sélecteur. Aucun index n'est nécessaire, il le rendra plus rapide.la source
Cela peut aider. Il contient également des exemples de code:
http://csv-mapper.rubyforge.org/
Ou pour une tâche de râteau pour faire de même:
http://erikonrails.snowedin.net/?p=212
la source
Il est préférable d'envelopper le processus lié à la base de données dans un
transaction
bloc. Le coup d'extrait de code est un processus complet d'amorçage d'un ensemble de langues vers le modèle de langue,L'extrait ci-dessous est une partie du
languages.csv
fichier,la source
Utilisez ce joyau: https://rubygems.org/gems/active_record_importer
Ensuite, vous pouvez maintenant utiliser:
Assurez-vous simplement que vos en-têtes correspondent aux noms de colonne de votre table
la source
La meilleure façon est de l'inclure dans une tâche de râteau. Créez le fichier import.rake dans / lib / tasks / et mettez ce code dans ce fichier.
Après cela, exécutez cette commande dans votre terminal
rake csv_model_import[file.csv,Name_of_the_Model]
la source
Je sais que c'est une vieille question, mais elle figure toujours dans les 10 premiers liens de Google.
Il n'est pas très efficace d'enregistrer les lignes une par une car cela provoque un appel à la base de données dans la boucle et il vaut mieux éviter cela, surtout lorsque vous devez insérer d'énormes portions de données.
Il est préférable (et beaucoup plus rapide) d'utiliser l'insertion par lots.
Vous pouvez créer une telle requête manuellement et que faire
Model.connection.execute(RAW SQL STRING)
(non recommandé) ou utiliser gemactiverecord-import
(il a été publié pour la première fois le 11 août 2010) dans ce cas, mettez simplement les données dans le tableaurows
et appelezModel.import rows
reportez-vous à la documentation de gem pour plus de détails
la source
Il vaut mieux utiliser CSV :: Table et utiliser
String.encode(universal_newline: true)
. Il convertit CRLF et CR en LFla source
Si vous souhaitez utiliser SmartCSV
Cela représente des données délimitées par des tabulations dans chaque ligne
"\t"
avec des lignes séparées par de nouvelles lignes"\n"
la source