【问题标题】:Rake db:reset execute in development and test environmentRake db:reset 在开发和测试环境中执行
【发布时间】:2026-01-02 06:30:01
【问题描述】:

我有一个 Ruby on Rails v5 应用程序,我正在尝试在开发环境中运行以下 Rake 任务:

rake db:reset

遗憾的是,Rake 在开发和测试环境中运行任务。由于我不使用测试环境,我不想将我的数据库翻倍。当没有定义 RAILS_ENV 时,我在某处读过 Rake 在两种环境中运行任务。所以我尝试将以下行添加到我的 .bash_profile 中,但没有成功:

export RAILS_ENV="development"

我也尝试在我的任务结束时添加 RAILS_ENV=development,但它也没有奏效。

有没有办法只在开发中使用 Rake?

更新 #1

感谢 Taryn East 的快速评论。我正在尝试尽快更新我的帖子,以便您轻松高效地回答。

当您运行该命令时,您实际观察到了什么?

该命令只需执行两次。由于我的开发和测试环境有不同的数据库,所以目前它没有显示任何错误。另一方面,它确实迫使我无缘无故地使用两个数据库。我还尝试为这两个环境设置相同的数据库,但是由于 Rake 尝试在数据库上运行两次任务,所以我遇到了错误。

例如 rake db:drop 的输出

Dropped database 'db'
Database 'db' does not exist

它确实删除了我的数据库,但正如您所见,Rake 尝试在另一个环境中再次运行该命令。

你为什么不用测试环境?

因为我没有看到它对我当前的项目有任何好处。我没有时间创建和更新测试。我也不习惯同时使用开发和测试环境。

如果你想在一个单一的环境中运行一个 rake 任务,你也可以在命令行中添加 RAILS_ENV。

正如我在帖子中所说,它不起作用。这是我所做的:

RAILS_ENV=development rake db:drop

这是输出:

Dropped database 'db'
Database 'db' does not exist

更新 #2

这是我的 database.yml 配置:

default: &default
  adapter:mysql2
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db
  username: something
  password: something
  host: localhost
  port: 3306

test:
  <<: *default
  database: db_test
  username: something
  password: something
  host: localhost
  port: 3306

不知道能不能帮上忙,不过我的环境是按照rake about任务开发的。

【问题讨论】:

  • 你怎么知道它在多个环境中运行?当您运行该命令时,您实际观察到什么?您收到什么错误消息?其次:你为什么不使用测试环境?你绝对应该设置其中之一!它不会使您的数据库翻倍...测试数据库是仅结构的,没有任何数据,除非您的测试(您应该拥有!)实际上正在运行。第三:如果你想在一个单一的环境中运行一个 rake 任务,你也可以在命令行中添加 RAILS_ENV。例如你可以运行:RAILS_ENV=test rake db:reset
  • 感谢您的回答。我在更新#1 部分回答了你。
  • "我没有时间创建和更新测试。"你也没有时间修复那些可能被这些测试提前发现的错误......;)
  • 这个问题听起来确实很奇怪——听起来 rake 在两个环境中同时运行,这是不应该的。你能告诉我们你的config/database.yml吗? (只需删除用户名/密码)?
  • 您对失去的时间绝对是正确的。我只是无法理解我无法在单个环境中运行我的任务。这没有道理。无论如何,我在帖子中做了另一个更新。

标签: ruby-on-rails database rake environment


【解决方案1】:

我在某处读过 Rake 在两种环境中运行任务时 没有定义 RAILS_ENV。

这是不正确的。如果环境是developmenttest 也会添加到当前环境中。见:https://github.com/rails/rails/blob/f507085fa2a7625324e6f4e3ecef9b27dabefb4f/activerecord/lib/active_record/tasks/database_tasks.rb#L339

所以这是预期的行为。

另一方面,您所说的对于任何其他环境都是正确的。例如。 RAILS_ENV=test rails db:drop 只会在测试环境中执行。

【讨论】: