ruby 在Rails中播种之前如何清除数据库

lsmd5eda  于 2023-05-28  发布在  Ruby
关注(0)|答案(7)|浏览(113)

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

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

重点是我想添加新数据,每个新插入都从id开始:1.我想避免的是删除一个有100行的表,当我添加新数据时,它从101开始。

0mkxixxg

0mkxixxg1#

更新答案

你必须安装 (或者你可以将gem 'database_cleaner'添加到你的Gemfile中) 一个名为Database Cleaner的GEM,它可以帮助清理你的数据库,而不会影响你的数据库模式。
要在每次执行rake db:seed时清理数据库,然后粘贴

# updated
require 'database_cleaner'

DatabaseCleaner.clean_with(:truncation)

在你的种子文件的顶部。将清空您的数据库,并重新从1开始计数。

***免责声明:*此更新的答案经过测试,在我的系统中运行良好。
===========================================================================
以前未测试的答案

你可以这样做,但这取决于你使用的数据库。
下面我将为一些流行的DB提供解决方案。
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

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

  • 希望这能帮到你…;)*
  • 免责声明:我已经分享了我的知识,以寻求您的帮助,但此解决方案尚未经过测试。*
mtb9vblg

mtb9vblg2#

您可以使用此命令

rake db:reset
kjthegm6

kjthegm63#

在Rails 5环境中

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

或者一起。

rails db:purge db:migrate db:seed
1cklez4t

1cklez4t4#

在执行rake db:seed之前。

rake db:purge

最近被添加到了rails 4.2.0.alpha的master分支中的ActiveRecord中
https://github.com/rails/rails/commit/e2f232aba15937a4b9d14bd91e0392c6d55be58d

ep6jt1vc

ep6jt1vc5#

在对这个主题做了更多的研究之后,我发现了'database_cleaner' gem。安装后,我只是简单地添加了DatabaseCleaner.clean_with(:truncation)在顶部我的seed.rb和宾果!它似乎可以在本地运行SQLite,并在Heroku上使用PostgreSQL。感谢所有的输入大家!:)

emeijp43

emeijp436#

不删除数据库:

回滚所有迁移,例如,如果它们小于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
1u4esq0p

1u4esq0p7#

从Rails 6开始,您可以运行

rails db:seed:replant

这将在播种之前截断数据库。

相关问题