Excluindo todos os registros em uma tabela de banco de dados


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.


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


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

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)

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)

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)

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.