Come resettare una singola tabella in rails?


86

Voglio che i valori della chiave primaria ricominciano da 1.

Risposte:


27

Per ripristinare l'indice / chiave primaria in SQLite basta digitare:

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

1
prendendo ispirazione dalla tua risposta ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
— mamesaye

1
Nel caso qualcuno lo avesse provato e avesse ricevuto un errore, l'ho fatto ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")e ha funzionato perché mi avrebbe dato un errore che diceva sqlite_sequence where name = 'yourtablename' is not a valid table nameo qualcosa del genere.
— l1zZY

184

Molte persone (come me) vengono qui per scoprire come eliminare tutti i dati nella tabella. Ecco qui:

$ rails console

> ModelName.delete_all

o

> ModelName.destroy_all

distruggere_all controlla dipendenze e callback e impiega un po 'più di tempo. delete_all è una semplice query SQL.

Maggiori informazioni qui: http://apidock.com/rails/ActiveRecord/Base/delete_all/class


14
Questa soluzione reimposta le voci della tabella, ma non la chiave primaria.
— Justin D.

4
Sì, è fantastico, ma voglio reimpostare l'indice! Né delete_all né destroy_all resettano l'indice a 1.
— Kyle Clegg

Questa risposta ha risolto la domanda della maggioranza degli utenti che l'hanno raggiunta. Questo è ciò che conta davvero. Oltre a ciò, non è l'unica risposta e non è contrassegnata come quella corretta. L'autore ha anche spiegato la sua intenzione. Quindi non vedo alcun problema.
— Edison Machado

45

Ho utilizzato quanto segue dalla console di rails per eliminare tutto nella tabella e quindi ripristinare il contatore dell'indice (Ruby 2 e Rails 4):

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

3
Questo ha funzionato molto bene per me, ma un piccolo dettaglio è che il tuo model_namecomando di reset deve essere plurale, come il nome effettivo della tabella NON il nome singolare del modello.
— Eli Duke

Funziona anche con la versione simbolica: ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
— Chris Cirefice

18

Il collegamento di @ khelll è utile. Il comando che vuoi troncare una tabella è:

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

16

A partire da Rails 4.2 puoi usare truncatedirettamente su una connessione ActiveRecord :

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

Questo cancella tutti i dati e reimposta i contatori di incremento automatico nella tabella. Funziona in MySQL e Postgres, non funziona in Sqlite.


10

Aggiungi gem 'database_cleaner'al tuo Gemfile, esegui $ bundle installe poi:

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

Puoi specificare più tabelle:

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

Se lasci fuori l'ultimo parametro, troncerà l'intero database:

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

6

Sto usando Rails 4.2.0 e Sqlite3

Ecco cosa ha funzionato per me (prendendo un po 'da tutto quanto sopra):

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

Sono stato quindi in grado di aggiungere nuovi record alla mia tabella con l'indice che inizia da 1


1

Per chiunque altro cerchi la risposta a questa domanda quando il database è Postgres, puoi farlo dalla console di Rails:

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

Dove accountsin accounts_id_seqè il nome della tabella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.