的ActiveRecord :: NoEnvironmentInSchemaError

Cod*_*ive 11 ruby ruby-on-rails-5

我想我的新升级的应用程序执行数据库相关的操作(Rails的5),我无法执行破坏数据库本地命令.
rails db:resetrails db:drop.

跟踪结果包含以下数据,

rails db:drop --trace
** Invoke db:drop (first_time)
** Invoke db:load_config (first_time)
** Execute db:load_config
** Invoke db:check_protected_environments (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config
** Execute db:check_protected_environments

rails aborted!
ActiveRecord::NoEnvironmentInSchemaError: 

Environment data not found in the schema. To resolve this issue, run: 

    bin/rails db:environment:set RAILS_ENV=development
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的是,

  1. 设置bin/rails db:environment:set RAILS_ENV=development,不会改变任何仍然发生错误.
  2. 手动将环境变量设置为开发.

这些都没有帮助.我正在寻找修复或解决方法.

Mat*_*att 21

两个修复 ActiveRecord::NoEnvironmentInSchemaError

这里的其他答案很好地描述了这个问题,但缺乏适当的解决方案。希望这个答案可以帮助遇到此问题的人。

为什么会发生此错误

此不正确的错误消息是此拉取请求的结果,旨在防止对生产数据库的破坏性操作。正如u/pixelearth 正确指出的那样,Rails 4.2 将表中的“key”字段定义为ar_internal_metadata整数,而 Rails 5+(包括 Rails 6)期望这是一个字符串,其值为environment。当 Rails 5 和 Rails 6 运行此安全检查时,它们错误地引发了 ,ActiveRecord::NoEnvironmentInSchemaError因为代码与 Rails 4 模式格式不兼容。

修复 #1:覆盖 Rails 5+ 中的安全检查

**请记住,安全检查是由于许多用户意外删除他们的生产数据库而实施的。正如问题所描述的,这些操作是破坏性的。

从终端:

rails db:drop RAILS_ENV=development DISABLE_DATABASE_ENVIRONMENT_CHECK=1
# and/or
rails db:drop RAILS_ENV=test DISABLE_DATABASE_ENVIRONMENT_CHECK=1
Run Code Online (Sandbox Code Playgroud)

如前所述这里,该DISABLE_DATABASE_ENVIRONMENT_CHECK=1标志可禁用环境检查。之后,您可以运行一个rake db:create RAILS_ENV=development,例如,使用ar_internals_metadata表中的正确架构重新创建数据库。

修复 #2:恢复到 Rails 4,删除数据库,回到 Rails 5+ 并重新创建

从终端:

git log
# grab the commit hash from before the upgrade to Rails 5+

git checkout **hash_from_rails_4**
rake db:drop RAILS_ENV=development
rake db:drop RAILS_ENV=test

git checkout master

# now things should work
rails db:migrate
Run Code Online (Sandbox Code Playgroud)

同样,在覆盖此功能时,请确保您没有指向生产数据库。或者,可以直接修改此表的架构。如果您在生产中遇到此错误,则可能需要采用此方法。

  • 对于 **Fix #2**,您不需要恢复到 Rails 4 来删除数据库;相反,您自己删除数据库并重试(这对我有用);即:`psql`,然后`\l`来查找我的测试数据库的名称,然后我用`drop database my_project_test;`删除它,然后退出。然后我就可以走了,感谢您帮助我找到这个解决方案! (2认同)

Pau*_*lgo 7

发生这种情况的原因是,由于某种原因,您的表ar_internal_metadata被删除或更改。如果无法通过命令行删除数据库,则需要通过DBMS或数据库客户端来删除数据库。然后,只需运行rails db:create db:migrate即可创建并运行迁移。


pix*_*rth 5

对于后代,我的问题是这个架构是由 rails 4 应用程序生成的,而当前使用它的应用程序是 rails 5。在 rails 5 中,ar_internal_metadata 表的结构略有变化。关键字段需要是一个字符串并包含单词“环境”,而不是一个整数。此错误仅在更改时消失。

它在 Rails 5 中应该是这样的

在此处输入图片说明

即,将 ar_internatl_metadata #key 的类型更改为字符串...

我的情况有点不常见,涉及共享相同数据库的 rails 4 应用程序和 rails 5 应用程序。当我需要“更新”时,我有一个任务:

  puts "Modifying Rails 4 schema to fit Rails 5 schema"
  file_name = "./db/schema.rb"
  rails_4_ar_internal_metadata = 'create_table "ar_internal_metadata", primary_key: "key", force: :cascade do |t|'
  rails_5_ar_internal_metadata = 'create_table "ar_internal_metadata", primary_key: "key", id: :string, force: :cascade do |t|'
  new_schema = File.read(file_name).gsub(rails_4_ar_internal_metadata, rails_5_ar_internal_metadata)
  File.write(file_name, new_schema)
Run Code Online (Sandbox Code Playgroud)