如何将Ecto连接到CockroachDB Serverless并正确配置连接字符串
解决方案
导致报错的核心原因是Ecto生成的连接参数中没有携带CockroachDB Serverless要求的集群标识,你可以选择以下任意一种方式配置:
方式1:直接配置完整连接字符串
你可以直接把CockroachDB控制台拿到的完整连接串赋值给Ecto Repo配置的url字段,无需拆分配置:
# 对应环境的config配置文件 config :your_app_name, YourAppName.Repo, url: "postgresql://username:你的密码@free-tier.gcp-us-central1.cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=#{System.expand_path("~/.postgresql/root.crt")}&options=--cluster%3D你的实际集群名"
注意:如果连接串中的密码包含特殊字符,需要提前做URL编码后再填入。
方式2:拆分配置项(更适合多环境变量管理场景)
如果需要分开管理用户名、密码、集群名等参数,可以用拆分配置的方式,把集群名放到parameters的options字段下即可:
# 对应环境的config配置文件 config :your_app_name, YourAppName.Repo, username: System.get_env("COCKROACH_USER", "默认用户名"), password: System.get_env("COCKROACH_PASSWORD", "默认密码"), hostname: "free-tier.gcp-us-central1.cockroachlabs.cloud", port: 26257, database: System.get_env("COCKROACH_DB", "defaultdb"), # SSL配置对应官方要求的verify-full模式 ssl: true, ssl_opts: [ verify: :verify_peer, cacertfile: System.get_env("COCKROACH_CERT_PATH", System.expand_path("~/.postgresql/root.crt")) ], # 此处填写你的实际集群名,会自动添加到连接参数中 parameters: [ options: "--cluster=你的实际集群名" ]
注意事项
- 两种配置方式二选一即可,无需同时配置
url和拆分参数 - 集群名可在CockroachDB Serverless控制台的连接信息页面获取,不要使用示例中的测试集群名
- 生产环境所有敏感配置请通过环境变量读取,不要硬编码到配置文件中
内容的提问来源于stack exchange,提问作者Jordan Lewis
相关产品推荐
相关产品推荐

