【问题标题】:Custom rake task for DB: Table not foundDB 的自定义 rake 任务:找不到表
【发布时间】:2016-07-07 15:01:58
【问题描述】:

我有一个自定义 rake 任务,它创建一个包含各种情况的数据的开发数据库。核心是这样的:

namespace :db do
  task setup_seed: :environment do
    Rake::Task['db:drop'].invoke
    Rake::Task['db:create'].invoke
    Rake::Task['db:schema:load'].invoke
    Rake::Task['db:migrate'].invoke
    Rake::Task['db:test:prepare'].invoke
    Rake::Task['db:seed'].invoke
  end
end

一切运行良好,直到调用db:seed,因为它抛出表不存在的错误。这是我的seed.rb

puts Rails.env
# => development
puts Article.count
# rake aborted!
# Mysql2::Error: Table 'app_test.articles' doesn't exist: SHOW FULL FIELDS FROM `articles`
# /usr/src/app/db/seeds.rb:2:in `<top (required)>'
# /usr/src/app/Rakefile:16:in `block (2 levels) in <top (required)>'
# Tasks: TOP => db:seed

我注意到这里有两件奇怪的事情:

  • 首先它没有找到表articles(或任何表)。当我在种子文件的开头停止并查看数据库(开发)时,表存在,但测试数据库为空
  • 我打印了Rails.env,它返回development。但是,失败消息指出它尝试加载 DB app_test.articles 而不是 app_development.articles

所以我认为这两个问题是相关的。

【问题讨论】:

  • 您应该省略 db:migrate 任务,因为架构已经加载。同时添加您当前的 Rails 版本,db:test:prepare 现已弃用。
  • Rails 版本是 3.2.9。当我删除db:migrate 任务时,会发生同样的错误

标签: mysql ruby-on-rails ruby rake rake-task


【解决方案1】:

我自己找到了解决方案。问题是,任务Rake::Task['db:test:prepare'].invoke 将环境更改为test,因此将该行放在脚本的底部并且一切正常:

namespace :db do
  task setup_seed: :environment do
    Rake::Task['db:drop'].invoke
    Rake::Task['db:create'].invoke
    Rake::Task['db:schema:load'].invoke
    Rake::Task['db:migrate'].invoke
    Rake::Task['db:seed'].invoke
    Rake::Task['db:test:prepare'].invoke # this one should be at the bottom
  end
end

【讨论】:

    【解决方案2】:

    看起来您正在开发环境中运行您的 rake 任务,但 db:test:prepare 默认在测试中运行。尝试调用:

    RAILS_ENV=test rake db:setup_seed
    

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 1970-01-01
      • 2015-11-13
      • 2014-04-19
      • 2019-03-03
      • 2017-06-21
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多