【问题标题】:How can I connect to a Cloud PostgreSQL database from dart code?如何从 dart 代码连接到 Cloud PostgreSQL 数据库?
【发布时间】:2020-10-18 00:36:25
【问题描述】:

我在 Google Cloud 中部署了一个 PostgreSQL 数据库,我正在尝试从 Cloud Run 实例连接到该数据库。我尝试了以下两个包,它们最终都导致了相同的异常:

我得到的例外是: SocketException: Failed host lookup: '/cloudsql/{INSTANCE_CONNECTION_NAME}' (OS Error: Name or service not known, errno = -2)

我在尝试建立连接时两次都到这里,所以在第一个包的情况下:

connection = new PostgreSQLConnection(
        '/cloudsql/{INSTANCE_CONNECTION_NAME}',
        5432,
        'postgres',
        username: 'username',
        password: 'password');
await connection.open(); // <-- exception thrown here

我已尝试将主机字符串更改为/cloudsql/INSTANCE_CONNECTION_NAME}/.s.PGSQL.5432,但没有成功。我的第一个想法是权限,Cloud Run 实例正在使用的服务帐户 (xxx-compute@developer.gserviceaccount.com) 具有 Cloud SQL Editor 角色(也尝试过 Client 和 Admin)。

从 dart 控制台应用程序在本地运行相同的数据库代码,我可以通过它的公共 IP 地址连接到我的数据库作为具有两个包的主机,因此数据库本身已启动并运行。

有人能指出这个例外的正确方向吗/有上面任何包的示例代码,以显示如何将它连接到 Cloud Run 中的 Cloud SQL 实例?

编辑: 我尝试在本地设置代理以测试连接是否错误,如下所示:

.\cloud_sql_proxy.exe -instances={INSTANCE_CONNECTION_NAME}=tcp:5433 psql

然后将代码中的连接主机值更改为localhost,将端口更改为5433。 令我惊讶的是它可以工作 - 所以从本地我似乎能够使用该连接字符串连接到数据库。但是,当我从 Cloud Run 实例中使用它时,它仍然不起作用。任何帮助表示赞赏!

【问题讨论】:

  • 您使用的是完全托管的 Cloud Run 吗?如果是这样,我认为链接对您有帮助cloud.google.com/sql/docs/postgres/connect-run
  • 是的,完全托管。这是我正在关注的文件,是的......太糟糕了,他们没有飞镖样本。我认为我已正确完成所有步骤,但会仔细检查。
  • 也许我理解错了,但PostgreSQLConnection()的第一个参数不是主机(ip/dns)吗?而且据我所知,这样的主机不能以“/”开头。
  • 确实是主机,所以应该是IP/DNS名称。我正在查看上面评论中发布的@SamuelRomero 文档中的示例,这就是我想到像这样放置主机的地方。那么正确的主机应该是什么?我应该删除领先的/ 还是应该输入一个IP?

标签: postgresql dart google-cloud-sql google-cloud-run


【解决方案1】:

dart 似乎不支持通过 unix socket 连接,你需要配置一个 IP(公共或私有,根据你的需要)。

您也可以使用支持unix socket connectionpg

希望这会有所帮助。

【讨论】:

  • 听到这个消息很难过。我知道 Node.js 可以工作,但我对 dart 中的解决方案特别感兴趣。您是否有消息来源可以跟踪 dart 是否会很快支持该 unix 套接字连接?
  • 不抱歉@blas3nik,您可以尝试打开功能请求问题...同时,您可以回退为您的数据库配置公共或私有 IP 并通过它进行连接。希望这会有所帮助
【解决方案2】:

仅针对将来遇到此问题的人: 就目前而言,我不得不求助于Daniele Ricci 发布的建议,并为数据库使用公共 IP。这里要指出的一件事是,由于 Cloud Runs 没有要运行的静态 IPv4 地址,因此必须将 DB 设置为允许来自任何地方的连接(必须添加来自 0.0.0.0/0 的授权连接),这是不安全的。在 dart 的开发团队弄清楚如何使用 UNIX 套接字之前,这似乎是让它工作的唯一方法。

【讨论】:

    【解决方案3】:

    我自己没有实际测试过,根据postgres包的source code,你必须指定你想要一个Unix套接字:

    connection = PostgreSQLConnection(
      ...
      isUnixSocket: true, //              <-- here
    );
    

    默认为false

    您传递的host 也必须有效。文档说:

    [host] 必须是主机名,例如“foobar.com”或 IP 地址。不包括方案或端口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 2021-09-30
      • 2020-05-04
      • 2021-11-21
      • 2021-03-15
      • 1970-01-01
      • 2019-04-18
      • 2020-07-16
      相关资源
      最近更新 更多