使用Rails控制台截断表格(或表格)

61

我有一个测试数据库,现在里面充满了垃圾数据。我已经在Rails控制台中执行了一些Table.destroy_all命令,删除了所有记录和依赖关系,这很棒。但是,我想要截断所有内容,使ID等重新从1开始。在Rails 3中有没有这样的方法?

12个回答

0
我使用以下代码来截断所有表。
ActiveRecord::Base.establish_connection
ActiveRecord::Base.connection.tables.each do |table|
  next if table == 'schema_migrations'

  case ActiveRecord::Base.connection.adapter_name.downcase.to_sym
    when :mysql2 , :postgresql
      ActiveRecord::Base.connection.execute("TRUNCATE #{table}")
      ActiveRecord::Base.connection.execute("TRUNCATE #{table} RESTART IDENTITY")
    when :sqlite
      ActiveRecord::Base.connection.execute("DELETE FROM #{table}")
  end
end

-5

我知道有点晚了

要求在控制台中执行此操作:

2.1.2 :001 > Post.all.each do |post|
2.1.2 :002 >   post.destroy!
2.1.2 :003 > end

同样有效...

本质上,这个循环遍历所有的帖子并将它们销毁。但它不会改变您的自增值...

相同的逻辑也适用于Rails 3(尽管我正在使用Rails 4)


5
  1. 不要使用 each,使用 find_each。它确保你不会在一次查询中获取数十亿条记录。
  2. 如果只需要从数据库中删除记录(而无需运行任何回调),请不要使用循环。只需执行 Post.delete_all 即可。
- Kukunin
原帖是关于如何使用Rails将自动索引重置为零(截断)数据库表的。而这个答案只会删除记录。 - Anton Semenichenko
  1. 这可能需要花费数小时的时间,因为您正在逐条删除记录。
  2. 这不会重置 SQL 中的任何序列。
  3. all.each 将加载所有帖子到内存中... 因此,如果您有数百万条记录,它可能会影响应用程序的性能。
- Argonus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接