如何在 rails 播种前清除数据库

How to clear database before seeding in rails

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

我在想:

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

关键是我想添加新数据,其中每个新插入都从 id: 1 开始。我想避免的是删除具有 100 行的 table 并且当我添加新数据时它从 101 开始.

在执行 rake db:seed.

之前
rake db:purge

最近已添加到 rails 4.2.0.alpha

主分支中的 ActiveRecord

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

你可以使用这个命令

rake db:reset

更新答案

您必须安装 (或者您可以将 gem 'database_cleaner' 添加到您的 Gemfile) 一个名为 Database Cleaner 的 GEM 这有助于清理您的数据库而不会影响您的数据库 schema._

每次执行 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


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

希望对您有所帮助...;)


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

在对该主题进行更多研究后,我找到了 'database_cleaner' gem。安装后,我只是在 seed.rb 和 Bingo 的顶部添加了 DatabaseCleaner.clean_with(:truncation)!它似乎在本地工作 运行 SQLite 和 Heroku 上的 PostgreSQL。感谢大家的投入! :)

在我的Rails5环境中。

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

或者全部在一起。

rails db:purge db:migrate db:seed

不删除(dropping)数据库:

回滚所有迁移,例如,如果它们 < 1000 并且在迁移和种子之后

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