Comment réinitialiser une seule table dans les rails?


86

Je veux que les valeurs de clé primaire recommencent à partir de 1.

Réponses:


27

Pour réinitialiser l'index / la clé primaire dans SQLite, tapez simplement:

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

1
s'inspirant de votre réponse ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye

1
Dans le cas où quelqu'un a essayé ceci et a obtenu une erreur, je l'ai fait ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")et cela a fonctionné parce que cela me donnerait une erreur qui disait sqlite_sequence where name = 'yourtablename' is not a valid table nameou quelque chose comme ça.
l1zZY

184

Beaucoup de gens (comme moi) viennent ici pour trouver comment supprimer toutes les données du tableau. Voici:

$ rails console

> ModelName.delete_all

ou

> ModelName.destroy_all

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

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


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

4
Ouais c'est super - mais je veux réinitialiser l'index! Ni delete_all ni destroy_all ne réinitialisent l'index à 1.
Kyle Clegg

Cette réponse a résolu la question des utilisateurs majoritaires qui l'ont atteinte. C'est ce qui compte vraiment. En plus de cela, ce n'est pas la seule réponse et ce n'est pas signalé comme étant la bonne. L'auteur a également expliqué son intention. Donc je ne vois aucun problème.
Edison Machado le

45

J'ai utilisé ce qui suit à partir de la console des rails pour supprimer tout ce qui se trouve dans la table, puis réinitialiser le compteur d'index (Ruby 2 et Rails 4):

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

3
Cela a très bien fonctionné pour moi, mais un petit détail est que votre model_namecommande de réinitialisation doit être au pluriel, comme le nom réel de la table PAS le nom singulier du modèle.
Eli Duke

Fonctionne également avec la version symbolique: ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice

18

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

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

16

Depuis Rails 4.2, vous pouvez utiliser truncatedirectement sur une connexion ActiveRecord :

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

Cela efface toutes les données et réinitialise les compteurs d'auto-incrémentation dans la table. Fonctionne dans MySQL et Postgres, ne fonctionne pas dans Sqlite.


10

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

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

Vous pouvez spécifier plus de tables:

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

Si vous laissez le dernier paramètre de côté, il tronquera toute la base de données:

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

6

J'utilise Rails 4.2.0 et Sqlite3

Voici 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'ai ensuite pu ajouter de nouveaux enregistrements à ma table avec l'index commençant à 1


1

Pour quiconque cherche la réponse à cette question lorsque la base de données est Postgres, vous pouvez le faire depuis la console Rails:

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

Où le accountsdans le accounts_id_seqest le nom de la table.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.