Comment réinitialiser une seule table dans les rails?

86

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

yukas
la source

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'")
Meule
la source
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

Flaviu
la source
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')
Meltemi
la source
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}")
vansan
la source
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.

BoraMa
la source
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
kikito
la source
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

skplunkerin
la source
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.

Matt Long
la source