rake db:migrate和rake db:create都作用在测试数据库上,而不是开发数据库。

8

我是新来的Stack Overflow和Ruby on Rails用户。我的问题是,当我运行rake db:create或rake db:migrate命令时,测试数据库受到影响,但开发数据库没有受到影响。

rails (3.2.2)

我的database.yml文件:

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test: &test
  adapter: postgresql
  encoding: unicode
  database: ticketee_test
  pool: 5
  username: ticketee
  password: my_password_here

development: 
  adapter: postgresql
  encoding: unicode
  database: ticketee_development
  pool: 5
  username: ticketee
  password: my_password_here

production:
  adapter: postgresql
  encoding: unicode
  database: ticketee_production
  pool: 5
  username: ticketee
  password: my_password_here

cucumber:
  <<: *test

感谢您的建议,但恐怕这不是原因。我的RAILS_ENV=development。当我启动rails服务器时,服务器运行开发数据库。如果我运行“rails server -e test”,那么服务器将使用测试数据库。我仍然不确定为什么迁移正在我的测试数据库上运行...
更新: 根据一位用户的建议,我注释掉了除开发环境之外的所有数据库配置,现在我收到一个错误。我正在运行postgresql,并且已安装'pg'宝石。首先,我的新database.yml:
development:
  adapter: postgresql
  encoding: unicode
  database: ticketee_development
  pool: 5
  username: ticketee
  password: my_password_here

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
#test: &test
#  adapter: postgresql
#  encoding: unicode
#  database: ticketee_test
#  pool: 5
#  username: ticketee
#  password: my_password_here

#production:
#  adapter: postgresql
#  encoding: unicode
#  database: ticketee_production
#  pool: 5
#  username: ticketee
#  password: my_password_here

#cucumber:
#  <<: *test

我的错误信息!

Someguys-MacBook-Air:ticketee someguy$ rake db:migrate
rake aborted!
database configuration does not specify adapter

Tasks: TOP => db:migrate => db:load_config
(See full trace by running task with --trace)
Someguys-MacBook-Air:ticketee someguy$ rake db:migrate -t
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Invoke rails_env (first_time)
** Execute rails_env
** Execute db:load_config
rake aborted!
database configuration does not specify adapter
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:45:in `resolve_hash_connection'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:39:in `resolve_string_connection'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:23:in `spec'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:127:in `establish_connection'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activerecord-3.2.2/lib/active_record/railtie.rb:76:in `block (2 levels) in <class:Railtie>'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:36:in `instance_eval'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:36:in `execute_hook'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:43:in `block in run_load_hooks'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:42:in `each'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activesupport-3.2.2/lib/active_support/lazy_load_hooks.rb:42:in `run_load_hooks'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activerecord-3.2.2/lib/active_record/base.rb:718:in `<top (required)>'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/activerecord-3.2.2/lib/active_record/railties/databases.rake:6:in `block (2 levels) in <top (required)>'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain'
/Users/someguy/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:176:in `block in invoke_prerequisites'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:174:in `each'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:174:in `invoke_prerequisites'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:157:in `block in invoke_with_call_chain'
/Users/someguy/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block (2 levels) in top_level'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block in top_level'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `block in run'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/gems/rake-0.9.2.2/bin/rake:33:in `<top (required)>'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/bin/rake:19:in `load'
/Users/someguy/.rvm/gems/ruby-1.9.3-p125@defaultGems/bin/rake:19:in `<main>'

使用上面的database.yml,执行rake db:create:all命令成功创建了我的表。然而,我的迁移仍然失败,并出现与上述相同的堆栈跟踪。

我将我的database.yml更改为以下内容:     development:       adapter:sqlite3       database:db / development.sqlite3       pool:5       timeout:5000

test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000

更新:我完全改变了我的database.yml文件,如下所示:

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

test: &test
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000

cucumber:
  <<: *test

现在,当我运行rake db:drop:all,然后是rake db:migrate时会发生以下情况。rake db:migrate命令执行迁移,在db/test.sqlite3上创建了一个表。所以,我的迁移仍在测试环境中运行。当我运行rake environment RAILS_ENV=development db:migrate时,同样的事情发生了,我也得到了一个test.sqlite3文件...

我的唯一建议是你在环境变量中设置了RAILS_ENV=test? - Matthew Rudy
你尝试过将除了开发环境之外的所有内容都注释掉,看看会发生什么吗?这可能不起作用,但可能会导致错误,从而找到解决方案。 - huntsfromshadow
好主意hutsfromshadow,现在我的控制台出现了错误信息!我在帖子中留下了更多细节... - geography_guy
1
我在使用pg gem时遇到了问题,所以我改用gem install ruby-pg没有出现问题。 - Josh
在你的命令行上运行 "echo $RAILS_ENV",输出是什么? - regulatethis
显示剩余2条评论
6个回答

5

在activerecord/lib/active_record/tasks/database_tasks.rb中有一行“出色”的代码:

environments << 'test' if environment == 'development' && ENV['RAILS_ENV'].nil?

直到2014年1月8日,它看起来像:

environments << 'test' if environment == 'development'

2

听起来你的解决方案可能涉及几个问题。由于现有元素,你的环境可能会混淆迁移。请使用以下命令重置你的数据库:

rake db:reset

或者

rake db:drop db:create

根据您的环境,您应该能够进行迁移。

rake db:migrate

PS - 你可能需要在每个命令的开头添加bundle exec

祝好运。


2

我昨晚也遇到了完全相同的问题。不知道是什么原因导致的,但最终找到了一个可行的解决方案。在 config/environments/develop.rb 文件中的 configure 块内,我添加了以下内容:

Rails.env = 'development'

我希望这对你也有帮助。

1
config/environments/name.rb 应该与 database.yml 中的名称匹配。Rails 更多地是约定而非配置。 - Sairam

1

你的yml文件中缺少host: localhost

请将您的配置更改为以下内容:

development:
  adapter: postgresql
  encoding: unicode
  host: localhost
  database: ticketee_development
  pool: 5
  username: ticketee
  password: my_password_here

我指定了主机,但问题仍然存在。请记住,我可以将迁移写入上面的测试数据库,但无论如何都无法写入开发环境。 - geography_guy
我怀疑这可能是一个空格问题。使用vim打开文件,命令为vi /path/to/database.yml,然后输入:set list以查看所有不可见字符。 - Josh
我刚试了一下,我看到了$符号,正好在我期望看到的位置,谢谢你的vi提示,这会很有用。 - geography_guy
当时我还以为那就是问题所在。 - Josh
问题在于它声称未指定适配器。 - Ryan Bigg

0

你可以使用 rake db:migrate RAILS_ENV="development"

或者你也可以使用:

set RAILS_ENV=development

rake db:migrate


0

分叉错误! 可能是一些缓存或日志问题,它显示我们代码中没有任何错误。

我的团队解决了这个问题。

  • 删除项目

  • git克隆项目

  • 配置database.yml

  • 启动服务器

一切都好!

同一个项目,错误消失了! 因此,我们认为这是环境问题或缓存或日志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接