【问题标题】:How to clear database before seeding in rails如何在 Rails 中播种之前清除数据库
【发布时间】:2026-01-19 23:15:01
【问题描述】:

是否可以在种子文件的顶部包含一行简单的代码,以便在插入新种子数据之前清除每个表,而无需运行任何 rake 命令来回滚表或数据库?

我在想这样的事情:

[Foo, Bar].each{|class| class.destroy_all}

关键是我想在每个新插入从 id 开始的地方添加新数据:1. 我要避免的是删除一个有 100 行的表,当我添加新数据时它从 101 开始。

【问题讨论】:

  • 您使用的是哪个数据库?
  • 我在本地使用 SQLite,并通过 Heroku 使用 PostgreSQL。这是我的第一个 SO 问题......我如何标记它已回答?此外,在做了更多研究之后,我发现了 database_cleaner gem,我刚刚在种子文件和 Bingo 的顶部添加了DatabaseCleaner.clean_with(:truncation)! :) 感谢 Vishal 的帮助!

标签: ruby-on-rails ruby database sqlite sqlite3-ruby


【解决方案1】:

更新答案

您必须安装(或者您可以将 gem 'database_cleaner' 添加到您的 Gemfile)一个名为 Database Cleaner 的 GEM,它有助于在不影响数据库架构的情况下清理您的数据库。_

每次你做rake db:seed然后粘贴时清理你的数据库

# updated
require 'database_cleaner'

DatabaseCleaner.clean_with(:truncation)

在种子文件的顶部。 它将清除您的数据库并再次从 1 开始计数。


免责声明:这个更新的答案已经过测试,并且在我的系统中完美运行。



====================================== ======================================

以前未经测试的答案

是的,您可以这样做,但这取决于您使用的数据库。

下面我为一些流行的数据库提供解决方案。

MySQL中,TRUNCATE table;删除所有行并重置自动递增计数器

PostgreSQL 中,它不会自动执行此操作。您可以使用 TRUNCATE TABLE table RESTART IDENTITY;

SQLite中,没有TRUNCATE语句,而是

DELETE FROM table;
DELETE FROM sqlite_sequence WHERE name='table';


你也可以试试这个

ActiveRecord::Base.connection.tables.each do |table|
  ActiveRecord::Base.connection.execute("TRUNCATE #{table}")
end


您可以选择任何一种解决方案并将其实施到您的种子文件中。

我希望这会对你有所帮助... ;)


免责声明:为了您的帮助,我分享了我的知识,但此解决方案未经测试。

【讨论】:

  • ActiveRecord::Base.connection.tables 可以删除您的迁移表...
【解决方案2】:

你可以使用这个命令

rake db:reset

【讨论】:

    【解决方案3】:

    在我的 Rails 5 环境中。

    rails db:purge
    rails db:migrate
    rails db:seed
    

    或全部一起。

    rails db:purge db:migrate db:seed
    

    【讨论】:

    • 不错。别忘了你可以链接这些像rails db:foo db:bar
    【解决方案4】:

    在做rake db:seed之前。

    rake db:purge
    

    最近在 rails 4.2.0.alpha 的 master 分支中添加了 ActiveRecord

    https://github.com/rails/rails/commit/e2f232aba15937a4b9d14bd91e0392c6d55be58d

    【讨论】:

    • 不确定这是否会重置新 ID 的计数,但这是 sqlite3 的操作方法:sql = "delete from sqlite_sequence where name = '#{table}'";ActiveRecord::Base.connection.execute(sql)
    【解决方案5】:

    在对该主题进行更多研究后,我发现了“database_cleaner”gem。安装后,我只是在我的 seed.rb 和 Bingo 顶部添加了DatabaseCleaner.clean_with(:truncation)!它似乎可以在本地运行 SQLite 并在 Heroku 上使用 PostgreSQL。感谢大家的所有投入! :)

    【讨论】:

      【解决方案6】:

      不移除(删除)数据库:

      回滚所有迁移,例如,如果它们

      STEP=1000 rails db:rollback && rails db:migrate && rails db:seed
      

      rails db:purge && rails db:migrate && rails db:seed
      

      删除(删除)数据库:

      删除(删除)数据库+创建数据库+迁移+种子

      rails db:reset
      

      rails db:drop && rails db:create && rails db:migrate && rails db:seed
      

      【讨论】: