2008-09-16 5 views
5

expérimenté avec Rails/ActiveRecord 2.1.1rake db: migrate ne détecte pas la nouvelle migration?

  • Vous créez une première version avec (par exemple) script Ruby \ générer le titre de produit d'échafaudage: Description de la chaîne: texte image_url: string
  • Cette création (par exemple) un fichier de migration appelé 20080910122415_create_products.rb
  • vous appliquez la migration avec rake db: migrer
  • maintenant, vous ajoutez un champ à la table de produit avec script Ruby \ générer la migration de prix add_price_to_product: décimal
  • Cette créer un fichier de migration appelé 20080910125745_add_price_to_product.rb
  • Si vous essayez d'exécuter rake db: migrate, la première migration sera restaurée, et non la suivante! Donc, votre table de produits sera détruite!
  • Mais si vous exécutiez seul râteau, il vous aurait dit qu'une migration était en attente

Pls noter que l'application rake db: migrate (une fois que la table a été détruite) appliquera toutes les migrations dans l'ordre.

La seule solution que j'ai trouvé est de préciser la version de la nouvelle migration comme dans:

rake db:migrate version=20080910125745 

Je me demande donc: est-ce un nouveau comportement attendu?

Répondre

1

Vous devriez pouvoir utiliser

rake db:migrate:up 

pour le forcer à aller de l'avant, mais vous risquez de migrations intercalés manquantes d'autres personnes de votre équipe

si vous exécutez

rake db:migrate 

deux fois, il va réappliquer toutes vos migrations.

Je rencontre le même comportement sur les fenêtres avec SQLite, il pourrait s'agir d'un bug spécifique à un tel environnement.

Modifier - J'ai trouvé pourquoi. Dans la base de données de railstie.tâche de rake que vous avez le code suivant:

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false." 
task :migrate => :environment do 
    ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true 
    ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) 
    Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby 
end 

ensuite dans mes variables d'environnement je

echo %Version% #=> V3.5.0f 

Ruby

ENV["VERSION"] # => V3.5.0f 
ENV["VERSION"].to_i #=>0 not nil ! 

ainsi la tâche Rake appelle

ActiveRecord::Migrator.migrate("db/migrate/", 0) 

et dans Active Record Migrator nous avons:

class Migrator#:nodoc: 
    class << self 
    def migrate(migrations_path, target_version = nil) 
     case 
     when target_version.nil?    then up(migrations_path, target_version) 
     when current_version > target_version then down(migrations_path, target_version) 
     else          up(migrations_path, target_version) 
     end 
    end 

Oui, rake db:migrate VERSION=0 est la version longue pour rake db:migrate:down

Modifier - Je voudrais aller mettre à jour le bug phare mais je le proxy super entreprise interdit que je me connecte là

En attendant, vous pouvez essayer d'annuler la version avant d'appeler la migration ...

0

Ce n'est pas le comportement attendu. J'allais suggérer de signaler cela comme un bug sur le phare, mais je vois que vous avez already done so! Si vous fournissez plus d'informations (y compris la version OS/database/ruby), je vais y jeter un coup d'oeil.

1

Je ne suis pas d'accord avec vous Tom! ce est un bug !! La version 3.5.0f n'est pas une version valide pour les migrations de rake. Rake ne doit pas l'utiliser pour migrer: down juste parce que ruby ​​a choisi de considérer que "V3.5.0f" .to_i est 0 ...

Rake devrait se plaindre que VERSION n'est pas valide pour que les utilisateurs sachent ce qui est en place (entre vous et moi, vérifier que la version est un horodatage formaté YYYYMMDD en convertissant en entier est un peu léger)

[Damn IE6 qui ne me permettra pas de commenter! et non, je ne peux pas changer votre navigateur grâce entreprise]

0

Jean,

Merci beaucoup pour votre enquête. Tu as raison, et en fait je pense que tu as découvert un bug plus sévère, d'un bug de conception d'espèce.

Ce qui se passe est que rake saisira la valeur que vous passez à la ligne de commande et les stockera comme variables d'environnement. Les tâches rake qui seront éventuellement appelées tireront simplement ces valeurs de la variable d'environnement. Lorsque db: migrate interroge ENV ["VERSION"], il demande en fait le paramètre de version que vous avez défini rake. Lorsque vous appelez rake db: migrate, vous ne transmettez aucune version.

Mais nous avons une variable d'environnement appelée VERSION qui a été définie à d'autres fins par un autre programme (je ne sais pas encore lequel). Et les gars derrière rake (ou derrière database.rake) n'ont pas compris que cela arriverait. C'est un bug de conception. Au moins, ils auraient pu utiliser des noms de variables plus spécifiques comme "RAKE_VERSION" ou "RAKE_PARAM_VERSION" au lieu de simplement "VERSION". Tom, je ne vais certainement pas fermer mais éditer mon rapport de bug sur le phare pour refléter ces nouvelles découvertes.

Et merci encore Jean pour votre aide.J'ai posté ce bug sur le phare comme 5 jours agao et toujours pas de réponse!

Rollo

Questions connexes