当你使用rails,并从Rake运行db:schema:dump
或db:structure:dump
时,它会将开发数据库的状态写出到模式文件中。当我们运行测试时,db:test:prepare
还会复制开发数据库的当前状态 - 这在某种程度上是有意义的,因为您可能正在开发需要对当前分支进行数据库调整的功能。
但是,我们通常需要将开发数据库重置为可以通过按顺序执行所有迁移来实现的状态,然后重置测试数据库以符合该状态 - 然后写出可以提交到生产分支的源代码树的模式/结构。目前,我们使用这个可怕的 shell 命令来做到这一点:
bundle exec rake db:drop && bundle exec rake db:create &&
bundle exec rake log db:migrate > /tmp/miglog.log &&
bundle exec rake db:schema:dump &&
RAILS_ENV=test bundle exec rake db:drop &&
RAILS_ENV=test bundle exec rake db:create && bundle exec rake
db:test:prepare
这看起来很可怕,绝对不可读,而且速度也很慢,因为这里的每次调用都会重新启动 Rails 环境。
这就是我想知道的:我们可以从这个命令中删除一些步骤吗?我们可以将这些折叠成手写的耙子任务吗?我认为这会很困难,因为 Rails 环境的配置会根据RAILS_ENV
的不同而有所不同,但希望至少删除 Rails 环境重新加载。
你可以把它简化为
bundle exec rake db:migrate:reset
bundle exec rake db:test:prepare
重置任务将运行删除、创建、迁移。运行迁移无论如何都会转储架构(除非您已将dump_schema_after_migration
更改为 false(
如您所知,test:prepare
步骤是转储和加载架构,还会执行清除(略微取决于数据库适配器,但基本上会删除并重新创建数据库(。鉴于您已经转储了架构,您可以将其更改为
bundle exec rake db:migrate:reset
bundle exec rake db:test:load_schema
最后,db:test 中的任务在很大程度上知道它们应该只针对测试数据库运行 - 无论 rails 环境如何,它们在需要时都会使用测试数据库,所以你可以只做
bundle exec rake db:migrate:reset db:test:load_schema
最后,有些人还会告诉你,从头开始运行迁移是异端邪说,最终的事实来源是 schema.rb(由您的生产环境生成(
你需要重置数据库,我真的建议你使用它:
rake db:drop # Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config)
然后
rake db:migrate
此外,您还有一个 rake 任务来重置数据库:
rake db:reset
正如我已经在这里发布的那样
至于测试,我强烈建议您使用Factory(FactoryGirl(并使用DatabaseCleaner。