如何从 dart 代码连接到 Cloud PostgreSQL 数据库?

How can I connect to a Cloud PostgreSQL database from dart code?

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

我得到的异常是: 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 运行 实例正在使用的服务帐户 (xxx-compute@developer.gserviceaccount.com) 具有 Cloud SQL Editor 角色(也尝试过 Client 和 Admin)。

运行从 dart 控制台应用程序在本地使用相同的数据库代码,我可以通过它的 public IP 地址连接到我的数据库作为两个包的主机,所以数据库本身已经启动和 运行.

有人可以用这个 exception/have 上面任何包的示例代码为我指明正确的方向,以显示如何将它连接到云 SQL 来自云的实例 运行?

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

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

然后将代码中的连接主机值更改为localhost,并将端口更改为5433。 令我惊讶的是它有效 - 所以从本地我似乎能够使用该连接字符串连接到数据库。但是,当我从 Cloud 运行 实例中使用它时,它仍然不起作用。感谢您的帮助!

dart 似乎不支持通过 unix 套接字连接,您需要配置一个 IP(public 或私有,根据需要)。

或者您可以使用 pg which support unix socket connection

希望对您有所帮助。

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

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

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

默认为false

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

[host] must be a hostname, e.g. "foobar.com" or IP address. Do not include scheme or port.