数据库的自定义 rake 任务:Table 未找到
Custom rake task for DB: Table not found
我有一个自定义 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
被调用,因为它抛出 tables 不存在的错误。这是我的 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
我注意到这里有两件奇怪的事情:
- 首先,它没有找到 table
articles
(或任何 table)。当我停在我的种子文件的开头并查看数据库(开发)时,table存在,但测试数据库是空的
- 我打印了
Rails.env
和 returns development
。但是,失败消息指出它尝试加载数据库 app_test.articles
而不是 app_development.articles
.
所以我认为这两个问题是相关的。
看起来你是 运行 开发环境中的 rake 任务,但 db:test:prepare
默认在测试中运行。尝试调用:
RAILS_ENV=test rake db:setup_seed
我自己找到了解决方案。问题是,任务 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
我有一个自定义 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
被调用,因为它抛出 tables 不存在的错误。这是我的 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
我注意到这里有两件奇怪的事情:
- 首先,它没有找到 table
articles
(或任何 table)。当我停在我的种子文件的开头并查看数据库(开发)时,table存在,但测试数据库是空的 - 我打印了
Rails.env
和 returnsdevelopment
。但是,失败消息指出它尝试加载数据库app_test.articles
而不是app_development.articles
.
所以我认为这两个问题是相关的。
看起来你是 运行 开发环境中的 rake 任务,但 db:test:prepare
默认在测试中运行。尝试调用:
RAILS_ENV=test rake db:setup_seed
我自己找到了解决方案。问题是,任务 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