2012-02-23 11 views
1

Je dois ajouter une autre colonne (email) à mon modèle d'utilisateur. Je ne souhaite pas modifier les données existantes dans la base de données MySQL. Comment devrais-je faire ça?migration avec datamapper

Ci-dessous est le code de ma classe de modèle original, et j'utilise Sinatra. Merci d'avance.

require 'rubygems' 
require 'data_mapper' 

DataMapper.setup(:default,'mysql://[email protected]/database') 

class User 
    include DataMapper::Resource 
    property :id,    Serial 
    property :name,   String, :unique=>true, :required=>true 
end 

DataMapper.finalize 

Répondre

3

Pour des choses simples comme l'ajout d'une nouvelle colonne, vous pouvez modifier votre modèle, puis appelez auto_upgrade!, comme ceci:

require 'rubygems' 
require 'data_mapper' 

class User 
    include DataMapper::Resource 
    property :id,    Serial 
    property :name,   String, :unique=>true, :required=>true 
    property :email,   String, :unique=>true, :required=>true 
end 

DataMapper.finalize 
DataMapper::Logger.new(STDOUT, :debug) 
DataMapper.setup(:default,'mysql://[email protected]/database') 
DataMapper.auto_upgrade! 

Notez que j'ai changé où setup est appelé, de sorte qu'un journal SQL est créé avant la mise en place de la connexion. Ici le journal SQL comprend la ligne suivante:

ALTER TABLE `users` ADD COLUMN `email` VARCHAR(50) NOT NULL 

Ce que je crois fait ce que vous voulez, sans altérer les données existantes. Notez cependant que si vous souhaitez modifier les caractéristiques d'une colonne (par exemple, en modifiant la taille des champs), cela ne fonctionnera pas. DataMapper ne vérifie pas ce genre de changement.

+0

J'utilise DataMapper.auto_upgrade! aussi. Cela fonctionne hors de la boîte tout le temps pour moi. –