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.