从当前工作树状态重新初始化Rails开发和测试数据库

时间:2016-02-12 09:34:58

标签: ruby-on-rails rake database-schema rails-migrations

使用rails时,从Rake运行说db:schema:dumpdb: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 env。

这就是我想知道的问题:我们可以从这个命令中删除一些步骤吗?我们可以将这些折叠成手写的Rake任务吗?我认为这很难,因为根据RAILS_ENV Rails环境的配置不同,但是至少要删除Rails环境重新加载。

2 个答案:

答案 0 :(得分:2)

您可以将其简化为

bundle exec rake db:migrate:reset 
bundle exec rake db:test:prepare 

重置任务运行drop,create,migrate。无论如何,运行迁移会转储架构(除非您已将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(由生产环境生成)

答案 1 :(得分:0)

您需要重置数据库我真的建议您使用它:

import rangy from 'rangy/lib/rangy-core';

(() => {
  window.taTools = {};
  window.rangy = rangy;
})();

import 'rangy/lib/rangy-selectionsaverestore';
import 'textangular/dist/textAngular-sanitize';
import 'textAngular/dist/textAngularSetup';
import 'textAngular/dist/textAngular';
import 'textAngular/dist/textAngular.css';

然后

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任务来重置数据库:

rake db:migrate

因为我已经发布了here

至于测试我强烈建议您使用工厂(FactoryGirl)并使用DatabaseCleaner