Excluindo todos os registros em uma tabela de banco de dados

129

Como excluo todos os registros em uma das minhas tabelas de banco de dados em um aplicativo Ruby on Rails?

Justin Meltzer
fonte

Respostas:

249

Se você estiver procurando uma maneira de fazê-lo sem o SQL, poderá usar delete_all.

Post.delete_all

ou com um critério

Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"

Veja aqui para mais informações.

Os registros são excluídos sem carregá-los primeiro, o que o torna muito rápido, mas interrompe a funcionalidade, como contador de cache, que depende do código de trilhos a ser executado após a exclusão.

HakonB
fonte
13
Vale a pena notar que se você tiver associações com: dependente =>: destroy ou qualquer coisa que precise ser limpa após a exclusão, provavelmente desejará Post.destroy_all - embora seja muito mais lento. Veja apidock.com/rails/ActiveRecord/Base/destroy_all/class
Michael Hellein
Esta resposta assume que a tabela tem um modelo associado a ela. O OP não especificou isso - e se a tabela for uma tabela de junção?
Toby 1 Kenobi
1
@BradWerth, independentemente de ser considerado por alguns como um estilo bom ou ruim, estou apenas dizendo que é viável que um banco de dados do Rails tenha tabelas que não sejam ActiveRecordmodelos. A pergunta é sobre a exclusão de registros de uma 'tabela' e estou apenas apontando ou a suposição contida na resposta.
Toby 1 Kenobi
Eu tenho a mesma consulta que a de Toby1Kenobi.
Nbsamar 26/07/19
30

Para excluir via SQL

Item.delete_all # accepts optional conditions

Para excluir chamando o método de destruição de cada modelo (caro, mas garante que os retornos de chamada sejam chamados)

Item.destroy_all # accepts optional conditions

Tudo aqui

brisa
fonte
21

se você deseja esvaziar completamente o banco de dados e não apenas excluir um modelo ou modelos anexados, você pode:

rake db:purge

você também pode fazer isso no banco de dados de teste

rake db:test:purge
KensoDev
fonte
5

Se você quer dizer excluir todas as instâncias de todos os modelos, eu usaria

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)
dfaulken
fonte
1
Prefira selectsempre que você precisar usar uma expressão if dentro de um bloco, para evitar ter que encadear o método compact para remover elementos nulos.
Sebastian Palma
4
BlogPost.find_each(&:destroy)
Philip
fonte
Isso é ótimo para circunstâncias com pouca memória.
Epigene
Esta é a única resposta que leva em consideração o consumo de memória.
John
2
Omg, por que fazer um loop para isso ... não faz sentido. apenas exclua todos os registros DELETE FROM da tabela, Model.delete_all
Imnl
@ John, por que uma única consulta consome mais memória do que um loop de consultas?
Imnl
@Imnl Cada iteração instancia uma nova instância do modelo em questão, para que ele possa processar os retornos de chamada para o método delete.
John
2

Se o seu modelo se chama BlogPost, seria:

BlogPost.all.map(&:destroy)
stef
fonte
isso buscará cada BlogPost e o carregará em uma matriz Ruby antes de destruí-los.
precisa saber é o seguinte
Depende do ORM. O Datamapper não faria isso porque você não está solicitando nada sobre cada modelo. E aqui está um stacktrace Mongoid que mostra que ele não seleciona nenhum campo antes de destruir cada entrada:MOPED: 127.0.0.1:27017 QUERY database=a_database collection=nothings selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3378ms)
stef
4
já que é uma questão trilhos, e o consulente não disse que ORM está usando, devemos assumir ActiveRecord
hdgarrood
2

Resposta mais recente, caso você queira excluir todas as entradas em todas as tabelas:

def reset
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration  }
end

Mais informações sobre o eager_load aqui .

Depois de chamá-lo, podemos acessar todos os descendentes de ActiveRecord::Basee podemos aplicar um delete_allem todos os modelos.

Observe que não limpamos a tabela SchemaMigration.

Simon Ninon
fonte