Como redefinir uma única mesa em trilhos?

86

Quero que os valores da chave primária comecem de 1 novamente.

yukas
fonte

Respostas:

27

Para redefinir o índice / chave primária no SQLite, basta digitar:

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
Rick
fonte
1
inspirando-se na sua resposta ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye
1
Caso alguém tentasse isso e obtivesse um erro, eu fiz ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")e funcionou porque me daria um erro que disse sqlite_sequence where name = 'yourtablename' is not a valid table nameou algo parecido.
l1zZY
184

Muitas pessoas (como eu) vêm aqui para descobrir como deletar todos os dados da tabela. Aqui está:

$ rails console

> ModelName.delete_all

ou

> ModelName.destroy_all

destroy_all verifica dependências e retornos de chamada e leva um pouco mais de tempo. delete_all é uma consulta SQL direta.

Mais informações aqui: http://apidock.com/rails/ActiveRecord/Base/delete_all/class

Flaviu
fonte
14
Esta solução redefine as entradas da tabela, mas não a chave primária.
Justin D.
4
Sim, isso é ótimo - mas eu quero reiniciar o índice! Nem delete_all ou destroy_all está redefinindo o índice para 1.
Kyle Clegg
Esta resposta resolveu a questão da maioria dos usuários que o alcançaram. Isso é o que realmente importa. Além disso, não é a única resposta e não está sinalizada como a correta. O autor também explicou sua intenção. Portanto, não vejo nenhum problema.
Edison Machado
45

Tenho usado o seguinte no console do Rails para excluir tudo na tabela e, em seguida, redefinir o contador de índice (Ruby 2 e Rails 4):

> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
Meltemi
fonte
3
Isso funcionou muito bem para mim, mas um pequeno detalhe é que o seu model_nameno comando reset precisa para o plural, como o nome real da tabela NÃO o nome singular do modelo.
Eli Duke de
Também funciona com a versão simbólica: ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice,
18

O link de @khelll é útil. O comando que você deseja truncar uma tabela é:

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

Desde Rails 4.2 você pode usar truncatediretamente em uma conexão ActiveRecord :

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

Isso limpa todos os dados e zera os contadores de incremento automático na tabela. Funciona em MySQL e Postgres, não funciona em Sqlite.

BoraMa
fonte
10

Adicione gem 'database_cleaner'ao seu Gemfile, execute $ bundle installe:

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

Você pode especificar mais tabelas:

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

Se você deixar o último parâmetro de fora, ele truncará todo o banco de dados:

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

Estou usando Rails 4.2.0 e Sqlite3

Aqui está o que funcionou para mim (considerando um pouco de todos os itens acima):

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

Consegui então adicionar novos registros à minha tabela com o índice começando em 1

skplunkerin
fonte
1

Para qualquer pessoa que esteja procurando uma resposta para essa pergunta quando o banco de dados for Postgres, você pode fazer isso no console do Rails:

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

Onde o accountsem accounts_id_seqé o nome da tabela.

Matt Long
fonte