无法使用rails db:system:change切换至PostgreSQL的手动操作求助
Rails 5.0.7.2 从SQLite3转PostgreSQL问题解决指南
为什么rails db:system:change --to=postgresql用不了?
这个命令是Rails 6.0才新增的功能,5.0.x版本根本没有,别折腾这个命令,手动修改配置就行。
你的两个疑问直接给答案
1. 需要在PostgreSQL控制台操作吗?
要,但只需要做基础的角色创建和权限配置:
- 进入PostgreSQL控制台:
sudo -u postgres psql - 创建对应角色(比如你报错里的
ubuntu):CREATE ROLE ubuntu WITH LOGIN PASSWORD '自定义密码'; - 给该角色赋予创建数据库的权限:
ALTER ROLE ubuntu CREATEDB; - 退出控制台:
\q
2. database.yml要改哪些内容?
把原来SQLite3的配置全部替换为PostgreSQL的配置,核心改动点:
- 适配器从
sqlite3改成postgresql - 删除
database: db/development.sqlite3这类SQLite路径配置,换成PostgreSQL的数据库名(一般和应用名一致,比如你的应用名_development) - 添加用户名、密码配置(和你刚创建的PostgreSQL角色信息对应);本地默认安装的PostgreSQL,主机、端口可以省略,默认连接
localhost:5432
两个错误的解决方法
Psych::BadAlias错误
这是YAML语法解析问题,Rails 5.0对YAML格式要求较严格,要么是你用了&/*这类别名语法但格式错误,要么是缩进不符合规范。解决方式:
- 移除database.yml中的所有YAML别名引用,每个环境写完整配置块
- 确保所有缩进都是2个空格(YAML对缩进敏感度极高)
PG::ConnectionBad: FATAL: role "ubuntu" does not exist
这个错误说明PostgreSQL中不存在名为ubuntu的数据库角色,按照上面控制台操作的步骤创建该角色,并赋予CREATEDB权限即可。
可用的database.yml示例
default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: ubuntu password: 你刚才设置的密码 development: <<: *default database: my_app_development test: <<: *default database: my_app_test production: <<: *default database: my_app_production username: my_app password: <%= ENV['MY_APP_DATABASE_PASSWORD'] %>
(如果还是出现Psych::BadAlias错误,直接去掉别名引用,把每个环境的配置展开写全即可)
最后收尾步骤
- 确保PostgreSQL服务已启动:
sudo systemctl start postgresql(Ubuntu系统) - 修改Gemfile:把
gem 'sqlite3'替换为gem 'pg',然后执行bundle install - 创建数据库:
rails db:create - 运行迁移:
rails db:migrate - 若需要迁移原有SQLite数据,可通过
sqlite3导出SQL文件后导入PostgreSQL,或编写脚本处理(注意数据类型兼容性)
内容的提问来源于stack exchange,提问作者railsnoob
相关产品推荐
相关产品推荐

