如何在 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
我可以在我的种子文件顶部包含一行简单的代码,以便在插入新的种子数据之前清除每个 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
主分支中的 ActiveRecordhttps://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