43 votes

Comment ignorer les migrations ayant échoué ? (rake db:migrer)

Je n'arrive pas à trouver une option ou quoi que ce soit qui me permette d'ignorer les migrations.

Je sais ce que tu penses : "tu ne devrais jamais avoir à faire ça..."

Je dois ignorer une migration qui modifie des enregistrements d'utilisateurs spécifiques qui n'existent pas dans ma base de données de développement. Je ne veux pas modifier la migration car elle ne fait pas partie de la source avec laquelle je suis censé travailler. Existe-t-il un moyen d'ignorer une migration ou d'ignorer les migrations ayant échoué ?

Merci d'avance!

16voto

user1647964 Points 51

J'ai eu un problème où j'avais une migration pour ajouter une table qui existait déjà, donc dans mon cas, j'ai également dû ignorer cette migration, car j'obtenais l'erreur

 SQLite3::SQLException: table "posts" already exists: CREATE TABLE "posts"

J'ai simplement commenté le contenu de la méthode de création de table, exécuté la migration, puis l'ai décommenté. C'est une sorte de moyen manuel de contourner le problème, mais cela a fonctionné. Voir ci-dessous:

 class CreatePosts < ActiveRecord::Migration
  def change
    # create_table :posts do |t|
    #   t.string :title
    #   t.text :message
    #   t.string :attachment
    #   t.integer :user_id
    #   t.boolean :comment
    #   t.integer :phase_id

    #   t.timestamps
    # end
  end
end

8voto

Dorian Points 2384

Si vous devez le faire, les migrations de votre application sont gâchées !

Insère toutes les migrations manquantes :

 def insert(xxx)
  ActiveRecord::Base.connection.execute("insert into schema_migrations (version) values (#{xxx})") rescue nil
end

files = Dir.glob("db/migrate/*")
files.collect { |f| f.split("/").last.split("_").first }.map { |n| insert(n) }

3voto

Timur Nugmanov Points 626

Pour ignorer toutes les migrations en attente, exécutez ceci dans votre terminal :

 echo "a = [" $(rails db:migrate:status | grep "down" | grep -o '[0-9]\{1,\}' | tr '\n' ', ') "];def insert(b);ActiveRecord::Base.connection.execute(\"insert into schema_migrations (version) values (#{b})\") rescue nil;end;a.map { |b| insert(b)}" | xclip

(Pour macOS, utilisez pbcopy au lieu de xclip) Ensuite, CTRL-V le résultat à l'intérieur de la console des rails :

 a = [ 20180927120600,20180927120700 ];def insert(b);ActiveRecord::Base.connection.execute("insert into schema_migrations (version) values (#{b})") rescue nil;end;a.map { |b| insert(b)}

Et appuyez sur ENTRÉE. Vous pouvez modifier la liste des migrations que vous souhaitez ignorer en les supprimant du tableau a avant d'exécuter la ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X