Rails是否内置将database.yml配置转换为数据库URL的方法?
从Rails的database.yml生成PostgreSQL数据库URL的方法
嘿,你猜的完全对——Rails确实内置了相关的转换能力,不用自己手动拼接字符串折腾!
一、用Rails内置方法一键生成
直接打开Rails控制台,跑下面这段代码就能拿到对应环境的数据库URL了:
# 针对你的development环境 config = ActiveRecord::Base.configurations["development"] uri = URI::Postgres.build( user: config["username"], password: config["password"], host: config["host"], port: config["port"] || 5432, # PostgreSQL默认端口是5432,没写的话就用这个 path: "/#{config["database"]}", # 这里得提醒下:你的database.yml里没写`database`字段哦,这是*必须的*,得先补上比如`database: my_dev_db` query: { encoding: config["encoding"], template: config["template"], schema_search_path: config["schema_search_path"], connect_timeout: config["connect_timeout"] }.compact.to_query ) uri.to_s
这段代码会自动把配置里的参数映射成符合规范的PostgreSQL URL,省得你自己处理转义那些麻烦事。
二、手动生成你需要的URL(基于现有配置)
先补上数据库名(比如假设叫my_dev_db),基于你给的配置生成的完整URL是这样的:
postgres://postgres:postgres@localhost:5432/my_dev_db?encoding=utf8&template=template0&schema_search_path=public%2Cextensions&connect_timeout=5
要是你不想写默认的5432端口,也可以省略,变成:
postgres://postgres:postgres@localhost/my_dev_db?encoding=utf8&template=template0&schema_search_path=public%2Cextensions&connect_timeout=5
对了,pool、reaping_frequency、checkout_timeout这些是Rails连接池的配置,不属于PostgreSQL连接URL的参数,所以不用放进URL里哈。
三、关于反向转换
你提到的从URL转回database.yml配置的需求,Rails也能搞定——用URI::Postgres.parse解析URL后,就能把各个参数映射成yml里的键值对了。
内容的提问来源于stack exchange,提问作者Niels Kristian
相关产品推荐
相关产品推荐

