带导轨控制台的截断工作台

问题描述 投票:0回答:13

我有这个测试数据库,到目前为止,里面塞满了垃圾。现在我已经在 Rails 控制台中执行了一些 Table.destroy_all 命令,它删除了所有记录和依赖项,这非常棒。然而;我想截断所有内容,以便 ID 等再次从 1 开始。 Rails 3 有什么办法吗?

ruby-on-rails ruby-on-rails-3 truncate rails-console
13个回答
164
投票

仅当您需要重新创建整个数据库时,接受的答案才有效。
要删除单个表(带有回调)并让 ID 从 1 开始:

Model.destroy_all # Only necessary if you want to trigger callbacks.
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name} RESTART IDENTITY")

如果您使用的是 Sqlite,它不支持截断,因此请执行以下操作:

Model.destroy_all # Only necessary if you want to trigger callbacks.
ActiveRecord::Base.connection.execute("Delete from #{table_name}")
ActiveRecord::Base.connection.execute("DELETE FROM SQLITE_SEQUENCE WHERE name='#{table_name}'")

31
投票
Model.connection.truncate(Model.table_name)

18
投票

这对我有用 -

ActiveRecord::Base.connection.execute("TRUNCATE table_name")


9
投票

Rails 6.0+ 添加新方法:truncate_tables

ActiveRecord::Base.connection.truncate_tables([:table1_name, :table2_name])

https://stackoverflow.com/a/68618256/7438710


2
投票

只需在下一次测试运行时重建数据库(这将在删除数据库后自动发生)。

rake db:drop RAILS_ENV=test


2
投票

你也可以这样做

rake db:rollback STEP=3 RAILS_ENV=test

其中 3 代表 db/migrate 中的迁移数量。例如:如果我有

db/migrate
20140121065542_create_users.rb
20140121065710_create_profiles.rb
20140121065757_create_articles.rb
20140121065900_create_comments.rb
20140121065929_create_categories.rb

所以我总共有 5 个迁移需要删除。如果我这样做

rake db:rollback STEP=5 RAILS_ENV=test
所有表都将从我的 TEST 数据库中删除,并且如果我删除 RAILS_ENV=test ,则所有 ENVIRONNMENT (生产、测试、开发)表都将被删除,并且还会清除其中的 db/shema.rb 文件迁移数据。


2
投票

rake db:reset
将执行
rake db:drop db:setup
。换句话说,删除数据库并重新设置数据库。

来源


2
投票

假设您使用的是 MySQL 或 Postgre,而不是 SQlite3(不支持

TRUNCATE
),您可以执行以下操作:

MyModel.connection_pool.with_connection { |c| c.truncate(MyModel.table_name) }

请注意,这不会调用 ActiveRecord 回调。


2
投票

Rails 6 添加了 rake 任务

db:truncate_all
。请参阅文档

您可以使用以下命令从 Rails 控制台调用它:

ActiveRecord::Tasks::DatabaseTasks.truncate_all

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

0
投票

您可以在 Rails 控制台中使用

ModelName.delete_all


0
投票

在较新的 Rails 版本 (7.x) 中,您还有另一个选择:

bin/rails db:seed:replant

截断当前环境的每个数据库的表并加载种子

记住运行它,同时指定环境,否则所有开发数据都将消失。

RAILS_ENV=test rails db:seed:replant

-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)

© www.soinside.com 2019 - 2024. All rights reserved.