web-dev-qa-db-fra.com

Rails rake db: migrate n'a aucun effet

J'ai créé une nouvelle application Rails 3 aujourd'hui, ajouté une migration simple et, pour une raison quelconque, rien ne se produit lorsque je rake db: migrate. Il fait simplement une pause de quelques secondes, puis retourne à la commande Invite, sans erreur ni rien. Schema.rb et la base de données restent vides.

Des idées sur ce qui pourrait se passer? J'ai créé de nombreuses applications et je n'ai jamais eu ce problème. Tout est une configuration totalement standard aussi.

28
Jack Hoge

Il existe plusieurs raisons pour lesquelles vos migrations ne s'exécutent pas, mais la plus courante est que le système a déjà l'impression que toutes les migrations que vous avez définies ont déjà été exécutées.

Chaque migration crée une entrée dans la table schema_migrations avec la colonne version correspondant au numéro d'identification. Si vous souhaitez forcer une migration à être réexécutée, vous pouvez généralement la sauvegarder et la réessayer. Par exemple, si vous aviez 20100421175455_create_things.rb, vous le ré-exécuteriez en utilisant:

rake db:migrate:redo VERSION=20100421175455

Une situation courante est que votre migration n'a pas réussi à s'exécuter, qu'elle a généré une exception, par exemple, et que Rails la considère toujours comme terminée. Pour ré-exécuter de force une migration, supprimez l'enregistrement correspondant de la table schema_migrations et exécutez à nouveau rake db:migrate.

Une façon d'éviter ce type de problème à l'avenir consiste à définir vos migrations à l'aide d'une procédure de sauvegarde automatique:

class CreateThings < ActiveRecord::Migration
  def self.up
    # ... (migration) ...

  rescue
    # If an exception occurs, back out of this migration, but ignore any
    # exceptions generated there. Do the best you can.
    self.down rescue nil

    # Re-raise this exception for diagnostic purposes.
    raise
  end
end

Si vous avez une erreur dans votre migration, l'exception sur la console sera listée. Étant donné que la migration a été automatiquement annulée, vous devriez pouvoir l'exécuter encore et encore jusqu'à ce que vous obteniez le résultat souhaité.

62
tadman

Appeler spring stop pourrait résoudre vos problèmes.

1
limlim

J'ai rencontré le même problème. J'ai fait une sorte de petit bidouillage qui m'a aidé. Je la publie juste au cas où quelqu'un voudrait une solution courte et douce. Je suis d'accord avec ce que dit Tadman 

"le système a déjà l'impression que toutes les migrations que vous avez définies ont déjà été exécutées"

Ce que j'ai fait était de changer le nom du fichier migrate dans le dossier/app_folder/db/migrate . Je pense que la partie numérique dans le nom du fichier de migration Ruby correspond à l’heure à laquelle le fichier a été créé. 

Vous pouvez ajouter le nom 1 au nom du fichier à chaque fois que vous souhaitez réexécuter la migration. Après avoir changé le nom, supprimez/supprimez la table (j'ai utilisé l'outil de ligne de commande mysql pour la suppression), puis exécutez rake db: migrate et les migrations doivent être effectuées.

0
Gaurav

Eh bien, j'ai découvert la cause de mon problème. J'utilise la gem slim_scrooge et commente tout se passe normalement. Je ne sais pas pourquoi si ...

0
Jack Hoge

J'ai rencontré un problème similaire aujourd'hui lors de la migration du plugin pour Redmine à l'aide de

rake redmine:plugins:migrate Rails_ENV=production NAME=plugin_name

où plugin_name est en fait le nom du plugin défini dans init.rb du plugin.

J'ai lutté pendant 4 heures et j'ai finalement compris que le nom de mon répertoire de plugin n'était pas le même que le nom du plugin (note redmine_ prefix):

~/redmine/plugins/redmine_plugin_name

Donc, assurez-vous que votre plugin est placé dans un dossier nommé d'après le nom du plugin. Je pense que cela s'applique également aux autres applications Rails.

0
Anton R