Cod*_*ive 11 ruby ruby-on-rails-5
我想我的新升级的应用程序执行数据库相关的操作(Rails的5),我无法执行破坏数据库本地命令.
rails db:reset或rails 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)
到目前为止我尝试过的是,
bin/rails db:environment:set RAILS_ENV=development,不会改变任何仍然发生错误.这些都没有帮助.我正在寻找修复或解决方法.
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 模式格式不兼容。
**请记住,安全检查是由于许多用户意外删除他们的生产数据库而实施的。正如问题所描述的,这些操作是破坏性的。
从终端:
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表中的正确架构重新创建数据库。
从终端:
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)
同样,在覆盖此功能时,请确保您没有指向生产数据库。或者,可以直接修改此表的架构。如果您在生产中遇到此错误,则可能需要采用此方法。
发生这种情况的原因是,由于某种原因,您的表ar_internal_metadata被删除或更改。如果无法通过命令行删除数据库,则需要通过DBMS或数据库客户端来删除数据库。然后,只需运行rails db:create db:migrate即可创建并运行迁移。
对于后代,我的问题是这个架构是由 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)
| 归档时间: |
|
| 查看次数: |
3438 次 |
| 最近记录: |