2010-06-15 15 views
3

Je cours un script d'importation qui importe un vidage CSV d'une base de données dans une base de données sqlite locale à l'aide de DataMapper.Clé primaire d'importation DataMapper

Mes modèles ressemblent à ceci:

class Staff 

    include DataMapper::Resource 

    property :staff_id, String, :key => true 
    property :full_name, String 

end 

class Project 

    include DataMapper::Resource 

    property :project_id, Integer, :key => true 
    property :title, String 
    property :status, String 

belongs_to :staff 

end 

Le CSV contient la clé primaire quand je suis fait l'importation que je utilise que comme il est la clé. La prochaine fois que j'exécuterai l'importation, je nettoierai les tables et recommencerai, cependant le datamapper gémit parce que les clés primaires ont déjà été prises.

Existe-t-il un moyen d'arrêter le gapper de datamapper à ce sujet ou dois-je simplement supprimer le fichier .db et recréer un fichier .db vide juste avant l'exécution de l'importation? Si oui, quel est le moyen le plus facile de le faire.

Répondre

2

Vous pouvez utiliser DataMapper.auto_migrate! pour supprimer les tables, puis les recréer en fonction de l'état actuel du modèle. Les nouvelles tables seront vides de toutes les données des exécutions précédentes.

Donc, juste après avoir défini vos modèles, mais avant de commencer à importer les données faire quelque chose comme ce qui suit:

DataMapper.finalize.auto_migrate! 
+0

Brillant, c'est exactement ce dont j'avais besoin. Merci! – Tom

0

Si vous créez la base de données complète à partir de l'importation, je vous recommande vraiment de nuoter complètement la base de données pour éviter tout débordement des exécutions précédentes. Cela permet également de tester votre chemin de code build-db.

+0

Oui, il est totalement créé à partir d'une exportation CSV, je ne rédigera pas à du tout . Alors devrais-je simplement supprimer le fichier et le créer à chaque fois? Si oui, quelle est la meilleure façon de le faire dans Ruby? – Tom