Datamith
Datamith est un framework ruby de conversion/import/fusion de base de donnée MySQL. Pour l'utiliser, il vous suffit de définir des fichiers de règles dans le dossier tables/.
Un fichier de règle contient une classe dérivée de Datamith::Converter. Il permet :
- de simplement transférer des données
- de convertir l'encodage (en utilisant iconv)
- de mettre à jour des entrées déjà existentes
- de prendre la valeur d'un champs et de l'insérer dans un autre champs
- d'ajouter des données à la suite des autres entrées plutôt que de préserver la primary key dans le mode append (mode définissable individuellement pour chaque entrée sur la base d'un objet Proc conditionnel)
- de retenir la valeur de l'ancienne primary key et le nouvel id inséré en mode append pour maintenir la cohérence des associations.
Il y a un fichier de règles par table à convertir, et chaque ensemble de règles est lancé individuellement sur chaque entrée. Un fichier de règles et la classe qu'il contient doivent être nommées de manière identique. Le nom du fichier peut être préfixé d'un nombre pour déterminer l'ordre d'execution des règles.
Configuration
Vous devez définir les hôtes, utilisateurs, mot de passes et noms de base de donnée dans le fichier config.yml.
Aussitôt que c'est fait, il vous est offert des tâches rake permettant de générer les fichiers de règle.
Générer un fichier pour chaque table :
rake tables:populate
Générer un fichier pour une table spécifique : (en supposant qu'il existe une table "users")
rake tables:generate:users
Vous pouvez aussi définir la clef "tables_to_convert" dans le fichier de configuration. Elle doit contenir la liste des tables que vous souhaitez traiter. L'ordre de la liste est préservé, et donc rake tables:populate avec :
tables_to_convert: [ users, posts, comments ]
génèrera :
tables/10_users.rb tables/20_posts.rb tables/30_comments.rb
Une liste vide ou absente signifie qu'il faut traiter toutes les tables.
Exécution
Lorsque vous avez finir d'écrire vos règles, lancez simplement :
rake convert
Si vous préférez un dump sous forme de fichier sql, vous pouvez utiliser plutôt la commande :
rake convert_dump
Vous êtes responsable de la redirection du contenu vers un fichier.
Conversion
Vous trouverez plus d'information dans la documentation de Datamith::Converter. Voici un exemple de ce qui peut être fait :
# tables/10_User.rb
class User < Converter
@@old_table = "xy_user"
@@new_table = "users"
@@old_primary_key = :account_number
@@skip = %w( 1 2 )
@@charset_from = "latin1"
def run
append :condition => Proc.new { |old,new| ( 15..20 ).include?( old[ :account_number ] ) }
convert :int, :account_number, :id
convert :string, :name
convert :timestamp_to_datetime, :created_at
end
end
# tables/20_Post.rb
class Post < Converter
@@old_table = "post"
@@new_table = "posts"
def run
appended_FK :user_id, :user
convert :int, :id
convert :int, :user_id
convert :string, :text
end
end
Ici, la table `user` est convertie en première. La primary key de l'ancienne table, appelée `xy_user`, est `account_number`. Elle est convertie en `id`, les entrées avec une valeur de 1 et 2 pour la primary key sont ignorés et ceux entre 15 et 20 sont ajoutés en tant que nouvelles entrées plutôt que simplement retranscrites.
La table `posts` est ensuite traitées. Le champs `user_id` se réfère à l'id de la table `users`, le converteur corrige donc les valeurs comprises entre 15 et 20 pour les remplacer par le nouvel id des entrées correspondantes. Cette fonctionalité est fournie par la méthode appended_FK().
Pour les autres entrées de la table `users` et pour toutes les entrées de la table `posts`, le converteur vérifie s'il y a déjà une entrée avec la même valeur pour la primary key. Si c'est le cas, l'entrée est mise à jour. Sinon, elle est insérée.
Documentation
La documentation est disponible sur la page de rdoc.
Téléchargement
Vous pouvez télécharger Datamith depuis sa page de projet sur Github.