2009-12-17 6 views

Répondre

23

Pour réinitialiser l'index/clé primaire dans SQLite il suffit de taper:

$ rails console 
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'") 
+0

s'inspirant de votre réponse ... 'Person.connection.execute ('delete from people')' 'Person.connection.execute (" mise à jour sqlite_sequence set seq = 0 où nom = 'People' ")' – mamesaye

+1

Si quelqu'un a essayé ceci et a eu une erreur, j'ai fait 'ActiveRecord :: Base.connection.execute (" DELETE de 'votretable' '') '' et cela a fonctionné parce que cela me donnerait une erreur dit 'sqlite_sequence où name = 'yourtablename' n'est pas un nom de table valide» ou quelque chose comme ça. – l1zZY

3

Je ne pense pas que vous pouvez le faire. Cependant, vous pouvez write your own rake task

Pour votre information, vous pouvez obtenir la liste des tâches de rake disponibles en faisant:

rake --tasks 

Vous obtiendrez quelque chose comme:

rake backups:clear    # Cleanup Backup files 
rake clear      # Cleanup temporary, log and backup files 
rake db:fixtures:load   # Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y 
rake db:migrate    # Migrate the database through scripts in db/migrate. Target specific version with VERSION=x 
rake db:schema:dump   # Create a db/schema.rb file that can be portably used against any DB supported by AR 
rake db:schema:load   # Load a schema.rb file into the database 
rake db:sessions:clear   # Clear the sessions table 
rake db:sessions:create  # Creates a sessions table for use with CGI::Session::ActiveRecordStore 
rake db:structure:dump   # Dump the database structure to a SQL file 
rake db:test:clone    # Recreate the test database from the current environment's database schema 
rake db:test:clone_structure # Recreate the test databases from the development structure 
rake db:test:prepare   # Prepare the test database and load the schema 
rake db:test:purge    # Empty the test database 
rake doc:app     # Build the app HTML Files 
rake doc:clobber_app   # Remove rdoc products 
rake doc:clobber_plugins  # Remove plugin documentation 
rake doc:clobber_rails   # Remove rdoc products 
rake doc:plugins    # Generate documation for all installed plugins 
rake doc:rails     # Build the rails HTML Files 
rake doc:reapp     # Force a rebuild of the RDOC files 
rake doc:rerails    # Force a rebuild of the RDOC files 
rake log:clear     # Truncates all *.log files in log/ to zero bytes 
rake rails:freeze:edge   # Lock to latest Edge Rails or a specific revision with REVISION=X (ex: REVISION=4021) or a tag with TAG=Y (ex: TAG=rel_1-1-0) 
rake rails:freeze:gems   # Lock this application to the current gems (by unpacking them into vendor/rails) 
rake rails:unfreeze   # Unlock this application from freeze of gems or edge and return to a fluid use of system gems 
rake rails:update    # Update both configs, scripts and public/javascripts from Rails 
rake rails:update:configs  # Update config/boot.rb from your current rails install 
rake rails:update:javascripts # Update your javascripts from your current rails install 
rake rails:update:scripts  # Add new scripts to the application script/ directory 
rake stats      # Report code statistics (KLOCs, etc) from the application 
rake test      # Test all units and functionals 
rake test:functionals   # Run the functional tests in test/functional 
rake test:integration   # Run the integration tests in test/integration 
rake test:plugins    # Run the plugin tests in vendor/plugins/**/test (or specify with PLUGIN=name) 
rake test:recent    # Test recent changes 
rake test:uncommitted   # Test changes since last checkin (only Subversion) 
rake test:units    # Run the unit tests in test/unit 
rake tmp:assets:clear   # Clears all files in tmp/test/assets 
rake tmp:cache:clear   # Clears all files and directories in tmp/cache 
rake tmp:clear     # Clear session, cache, and socket files from tmp/ 
rake tmp:create    # Creates tmp directories for sessions, cache, and sockets 
rake tmp:pids:clear   # Clears all files in tmp/pids 
rake tmp:sessions:clear  # Clears all files in tmp/sessions 
rake tmp:sockets:clear   # Clears all files in tmp/sockets 

via

+5

Cette option a été sélectionnée comme meilleure réponse, mais elle ne répond pas vraiment à la question. @OP, comment l'avez-vous fait? – CharlieMezak

2

Jetez un coup d'oeil here, vous pourriez encore avoir besoin d'une petite personnalisation pour tronquer une table spécifique.

166

Beaucoup de gens (comme moi) viennent ici pour trouver comment supprimer toutes les données de la table. Ici, vous allez:

$ rails console 

> ModelName.delete_all 

ou

> ModelName.destroy_all 

destroy_all vérifie les dépendances et les callbacks, et prend un peu plus longtemps. delete_all est une requête SQL directe.

Plus d'infos ici: http://apidock.com/rails/ActiveRecord/Base/delete_all/class

+8

Cette solution réinitialise les entrées de la table, mais pas la clé primaire. –

+4

Ouais c'est génial - mais je veux réinitialiser l'index! Ni delete_all ni destroy_all ne réinitialise l'index à 1. –

+2

Ceci n'est pas la réponse à la question. Pourquoi a-t-il reçu autant de votes? >< –

17

@ lien de khelll est utile. La commande que vous voulez tronquer une table est:

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}") 
+2

Ne semble pas fonctionner sur Rails 4 – Epigene

10

Ajouter gem 'database_cleaner' à votre Gemfile, exécutez $ bundle install, puis:

> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename']) 

Vous pouvez spécifier plusieurs tables:

> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3']) 

Si vous quittez le dernier paramètre sur, il tronque la base de données entière:

> DatabaseCleaner.clean_with(:truncation) # your database is truncated 
+0

Parfait, merci. C'est la seule chose qui a fonctionné pour moi dans Sqlite. –

1

Pour quelqu'un d'autre à la recherche de la réponse à cette question lorsque la base de données est Postgres, vous pouvez le faire à partir de la console Rails:

rails console 
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)") 

Lorsque le accounts dans le accounts_id_seq est le nom de la table.

35

Je me sers de la console de rails comme suit pour supprimer tout dans le tableau, puis remettre le compteur d'index (Ruby Rails 2 & 4):

> ModelName.delete_all 
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name') 
+3

fonctionne seulement avec postgreSQL – achabacha322

+3

Cela a très bien fonctionné pour moi, mais un petit détail est que votre 'model_name' dans la commande de réinitialisation doit pluriel, comme le nom réel de la table PAS le nom singulier du modèle. –

6

J'utilise Rails 4.2.0 et Sqlite3

est ici ce qui a fonctionné pour moi (en prenant un peu de tout ce qui précède):

$ rails c 
> ModelName.delete_all 
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'") 

j'étais alors en mesure d'ajouter de nouveaux enregistrements à ma table avec l'index de départ de retour à 1

3

Depuis Rails 4.2, vous pouvez utiliser truncate directement sur un ActiveRecord connection:

ActiveRecord::Base.connection.truncate(:table_name) 

Ce efface toutes les données et réinitialise les compteurs d'auto-incrustation dans le tableau. Fonctionne dans MySQL et Postgres, ne fonctionne pas dans Sqlite.

Questions connexes