我正在尝试在我新升级的应用程序(Rails5)上执行与数据库相关的操作,但我无法在本地执行破坏性的数据库命令。
或者
..。
跟踪结果为以下数据,
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到目前为止我试过的是,
设置
,不会更改任何内容,但仍会发生错误。
手动设置开发环境变量。
这些都没有帮助。我正在寻找修复或解决方法。
发布于 2020-01-21 00:02:22
两个修复
这里的其他答案很好地描述了问题,但缺乏适当的解决方案。希望这个答案能帮助遇到这个问题的人。
为什么会发生这个错误
此不正确的错误消息是由于
此拉取请求
旨在防止对生产数据库的破坏性操作。作为
u/pixelearth正确地指出
,Rails 4.2定义了
表是一个整数,而Rails 5+ (包括Rails 6)希望它是一个带有值的字符串,
..。当Rails 5和Rails 6运行此安全检查时,它们会错误地引发
因为代码与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如上所述
这里
、、
标志禁用环境检查。之后,您可以运行
中的正确架构重新创建数据库。
表格。
修复#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同样,在覆盖此功能时,请确保您没有指向生产数据库。或者,也可以直接修改这个表的模式。如果您在生产中遇到此错误,则可能需要采用此方法。
发布于 2018-04-04 21:08:03
这是因为,出于某种原因,您的表
被删除或更改。如果不能通过命令行删除数据库,则需要通过DBMS或数据库客户端删除。然后,只需运行
创建并运行迁移。
发布于 2019-05-26 08:22:52
对于后人来说,我的问题是这个模式是由rails 4应用程序生成的,而当前使用它的应用程序是rails 5。
_
内部
_
元数据表发生了细微的变化。键字段需要是字符串,并且包含单词“environment”,而不是整数。只有当这一点被改变时,这个错误才会消失。
在Rails5中应该是这样的

即,更改ar的类型
_
国际
_
元数据#字符串的关键字...
我的情况有点不常见,涉及到一个Rails4应用程序和一个Rails5应用程序共享同一个数据库。当我需要“更新”时,我有一个任务:
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)https://stackoverflow.com/questions/45925383
复制相似问题