65 votes

Supprimer tout de toutes les tables (dans Activerecord)

Je peux faire Post.delete_all pour supprimer tous mes articles, mais que se passe-t-il si je veux supprimer tous les articles, commentaires, blogs, etc.? Autrement dit, comment puis-je parcourir tous mes modèles et exécuter le delete_all méthode?

87voto

Vlad Zloteanu Points 5730
 rake db:reset 
 

Il recrée votre table à partir des migrations.

Comme suggéré dans les commentaires, un moyen plus rapide de le faire (mais vous devez ajouter une nouvelle tâche de rake) est:

 namespace :db do
  desc "Truncate all tables"
  task :truncate => :environment do
    conn = ActiveRecord::Base.connection
    tables = conn.execute("show tables").map { |r| r[0] }
    tables.delete "schema_migrations"
    tables.each { |t| conn.execute("TRUNCATE #{t}") }
  end
end
 

Réponse copiée de: réponse le SO .

28voto

Sameer C Points 946

Vous pouvez avoir un contrôle plus fin avec:

 rake db:drop:all
 

Et puis créer la base de données sans exécuter les migrations,

 rake db:create:all
 

Puis lancez toutes vos migrations,

 rake db:migrate 
 

Vous pouvez aussi faire:

 mysqladmin drop databasename
 

25voto

James A. Rosen Points 25774

Si vous essayez de le faire depuis le code au lieu de la ligne de commande, par exemple avec une méthode Test::Unit::TestCase#teardown , vous pouvez faire soit

 class MyTest < Test::Unit::TestCase

  def teardown
    ActiveRecord::Base.subclasses.each(&:delete_all)
  end

end
 

ou

 class MyTest < Test::Unit::TestCase

  def teardown
    Rake::Task['db:reset'].invoke
  end

end
 

Je vous préviens cependant: ni l'un ni l'autre n'est particulièrement rapide. Vous êtes certainement mieux avec des tests transactionnels si vous le pouvez.

18voto

KenB Points 2898

Si vous voulez simplement recommencer à zéro avec un nouvel ensemble de tables vides, vous devez d'abord vous assurer que vous avez une définition à jour du schéma dans db / schema.rb:

 rake db:schema:dump
 

et alors:

 rake db:schema:load
 

ce qui a pour effet de supprimer des tables, puis de les recréer, sans passer par toute votre batterie de migrations.

10voto

David James Points 8344

Un moyen plus rapide de simplement supprimer les lignes de la table est d'utiliser la commande TRUNCATE.

De nombreuses autres réponses semblent ignorer la différence entre la suppression de lignes et la suppression d'une table. La suppression d'une table détruit les données du tableau et le schéma, ce qui signifie que vous avez besoin de mesures supplémentaires pour recréer les tables. Sean McLeary réponse était le meilleur que j'ai vu, je l'ai donc utilisé en tant que point de départ. Cependant, je pense qu'il est préférable de profiter de la TRUNCATE, parce qu'il devrait être plus rapide et il réinitialise également les auto-incrémentation des clés. Aussi, à l'aide de map au lieu de each raccourcit un peu le code.

namespace :db do
  desc "Truncate all tables"
  task :truncate => :environment do
    conn = ActiveRecord::Base.connection
    tables = conn.execute("show tables").map { |r| r[0] }
    tables.delete "schema_migrations"
    tables.each { |t| conn.execute("TRUNCATE #{t}") }
  end
end

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