【问题标题】:How do I connect Ecto to CockroachDB Serverless?如何将 Ecto 连接到 CockroachDB Serverless?
【发布时间】:2021-12-13 05:44:36
【问题描述】:

我想在我的 Ecto 应用程序中使用 CockroachDB Serverless。如何指定连接字符串?

我在尝试连接时遇到这样的错误。

[error] GenServer #PID<0.295.0> terminating
** (Postgrex.Error) FATAL 08004 (sqlserver_rejected_establishment_of_sqlconnection) codeParamsRoutingFailed: missing cluster name in connection string
    (db_connection 2.4.1) lib/db_connection/connection.ex:100: DBConnection.Connection.connect/2

CockroachDB Serverless 表示通过在连接字符串中包含集群名称进行连接,如下所示:

postgresql://username:<ENTER-PASSWORD>@free-tier.gcp-us-central1.cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=$HOME/.postgresql/root.crt&options=--cluster%3Dcluster-name-1234

但我不确定如何让 Ecto 通过其配置创建此连接字符串。

【问题讨论】:

    标签: database elixir ecto cockroachdb cockroachcloud


    【解决方案1】:

    问题在于 Postgrex 无法解析来自连接 URL 的所有信息 - 特别是 SSL 配置。解决方案是明确指定连接参数,包括cacertfile SSL 选项。假设您已将集群的 CA 证书下载到priv/certs/ca-cert.crt,您可以使用以下配置作为模板:

    config :my_app, MyApp.Repo,
      username: "my_user",
      password: "my_password",
      database: "defaultdb",
      hostname: "free-tier.gcp-us-central1.cockroachlabs.cloud",
      port: "26257",
      ssl: true,
      ssl_opts: [
        cacertfile: Path.expand("priv/certs/ca-cert.crt"),
      ],
      parameters: [options: "--cluster=my-cluster-123"]
    

    可能的其他问题

    表格锁定

    由于 CockroachDB 也不支持 Ecto/Postgrex 尝试对迁移表进行锁定,因此还需要禁用 :migration_lock 配置:

    config :my_app, MyApp.Repo,
      # ...
      migration_lock: false
    

    授权生成器

    最后,新的phx.gen.auth 生成器默认使用citext 扩展来以不区分大小写的方式存储用户的电子邮件地址。应删除生成的迁移中执行CREATE EXTENSION IF NOT EXISTS citext 的行,并将:email 字段的列类型从:citext 更改为:string

    【讨论】:

      【解决方案2】:

      此配置允许 Ecto 正确连接 CockroachDB Serverless:

      config :myapp, MyApp.repo,
        username: "username",
        password: "xxxx",
        database: "defaultdb",
        hostname: "free-tier.gcp-us-central1.cockroachlabs.cloud",
        port: 26257,
        ssl: true,
        ssl_opts: [
          cert_pem: "foo.pem",
          key_pem:  "bar.pem"
        ],
        show_sensitive_data_on_connection_error: true,
        pool_size: 10,
        parameters: [
          options: "--cluster=cluster-name-1234"
        ]
      

      【讨论】:

      • 请将此答案标记为正确。
      • 完成,谢谢提醒。
      • 这个答案没有解决问题——配置无效。
      • 安德鲁,我已将您的答案标记为“正确”。感谢您的更新。
      猜你喜欢
      • 2021-12-13
      • 2021-12-13
      • 2022-08-30
      • 2017-03-23
      • 2021-04-14
      • 2017-11-08
      • 2019-12-17
      • 2019-04-05
      • 1970-01-01
      相关资源
      最近更新 更多