You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让rake db:migrate解密secure_yaml加密的database.yml数据库密码

报错ORA-01017的根因为Rake任务加载database.yml时,secure_yaml的解密逻辑未提前触发,Rails直接将ENC(yCuO9BOKb3pa2SoiFq+B6A==)原始字符串作为密码传入数据库连接逻辑。

现有secure_yaml方案修复步骤
  • 将Gemfile中secure_yaml的声明移到所有Rails相关gem之前,确保YAML解析补丁在database.yml读取前生效
  • 提前加载解密逻辑:在config/application.rb最顶部、加载Rails框架之前加入以下代码,替换为你的实际密钥路径:
require 'secure_yaml'
SecureYaml.load_key('config/secure_yaml_key')
  • 适配Rake任务:在Rakefile第一行加入上述secure_yaml加载代码,避免Rake默认加载流程跳过gem初始化钩子
  • 确认运行rake任务的环境中已注入secure_yaml所需的密钥变量,避免密钥读取失败导致解密逻辑未执行
  • 验证:运行rails c执行puts Rails.application.config.database_configuration[Rails.env]['password'],输出明文密码则说明配置生效,再运行rake db:migrate即可
更优的数据库密码加密方案

如果secure_yaml适配成本过高,推荐以下两种兼容性、安全性更高的方案:

方案1:Rails原生加密凭证(Rails 5.2+ 首选)

Rails内置加密凭证存储,无需第三方依赖,全场景兼容:

  • 执行rails credentials:edit打开加密凭证文件,添加数据库密码配置:
database:
  development:
    password: 开发环境明文密码
  production:
    password: 生产环境明文密码
  • 修改database.yml的password字段:
development:
  adapter: oracle_enhanced
  database: db_name
  username: username
  password: <%= Rails.application.credentials.dig(:database, Rails.env.to_sym, :password) %>
  • 仅需将config/master.key排除在版本控制之外,所有Rails默认流程包括Rake任务都会自动解密读取,无兼容问题。

方案2:环境变量注入

行业通用的敏感信息管理方案,无需加密YAML文件:

  • 修改database.yml的password字段:
password: <%= ENV['DB_PASSWORD'] %>
  • 本地开发可搭配dotenv gem,将密码写入排除版本控制的.env文件;生产环境通过操作系统环境变量、容器配置或部署平台的敏感参数功能注入密码,完全避免敏感信息提交到代码仓库。

内容的提问来源于stack exchange,提问作者Pro_grammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:15:08