web-dev-qa-db-fra.com

Tronquer les tables avec la console Rails

J'ai cette base de données testing qui, à présent, est bourrée de bric-à-brac. Maintenant, j'ai effectué quelques commandes Table.destroy_all dans la console Rails, qui suppriment tous les enregistrements et dépendances, ce qui est génial. Toutefois; Je voudrais tout tronquer pour que les identifiants commencent à 1. Y a-t-il un moyen dans Rails 3?

37
CaptainCarl

La réponse acceptée ne fonctionne que si vous devez recréer la base de données entière.
Pour supprimer une seule table (avec les rappels) et pour obtenir les ID à partir de 1:

Model.destroy_all # Only necessary if you want to trigger callbacks.
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name} RESTART IDENTITY")

Si vous utilisez Sqlite, il ne prend pas en charge la troncature, procédez comme suit:

Model.destroy_all # Only necessary if you want to trigger callbacks.
ActiveRecord::Base.connection.execute("Delete from #{table_name}")
ActiveRecord::Base.connection.execute("DELETE FROM SQLITE_SEQUENCE WHERE name='#{table_name}'")
120
Ravi Sankar Raju
Model.connection.truncate(Model.table_name)

Vous pouvez aussi faire rake db:rollback STEP=3 Rails_ENV=test

où 3 représente le nombre de migrations que vous avez dans db/migrate. En exemple: si j'ai dans

db/migrate
20140121065542_create_users.rb
20140121065710_create_profiles.rb
20140121065757_create_articles.rb
20140121065900_create_comments.rb
20140121065929_create_categories.rb

J'ai donc 5 migrations à supprimer. Si je fais rake db:rollback STEP=5 Rails_ENV=test, toutes les tables seront supprimées de ma base de données TEST et si je supprime Rails_ENV = test, toutes les tables ENVIRONNMENT (production, test, développement) seront supprimées et le fichier db/shema.rb sera également supprimé de ses données de migration. . 

2

rake db:reset effectuera rake db:drop db:setup. En d'autres termes, supprimez la base de données et configurez-la à nouveau.

La source

2
Eva

Reconstruisez simplement la base de données lors du prochain test (cela se fera automatiquement après son abandon).

rake db:drop Rails_ENV=test

2
Yam Marcovic

En supposant que vous utilisez MySQL ou Postgre et non SQlite3 (qui ne supporte pas TRUNCATE), vous pouvez procéder comme suit:

MyModel.connection_pool.with_connection { |c| c.truncate(MyModel.table_name) }

Notez que cela n’appelle pas les rappels ActiveRecord.

1
jsears