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

anauzrmj  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(4)|浏览(178)

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

我得到的例外是:/cloudsql/INSTANCE_CONNECTION_NAME}/.s.PGSQL.5432
我在尝试建立连接时两次都在这里,所以在第一个包的情况下:

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角色(也尝试了客户端和管理员)。
从dart控制台应用程序本地运行相同的数据库代码,我可以通过其公共IP地址连接到我的数据库,作为两个包的主机,因此数据库本身是启动和运行的。
有人能为我指出这个异常的正确方向吗?/有一个上面任何包的示例代码,来展示如何从Cloud Run将其连接到Cloud SQL示例?

Edit:我尝试在本地设置一个代理来测试连接是否错误,如下所示:

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

然后将代码中的连接主机值更改为localhost,将端口更改为5433。令我惊讶的是,它可以正常工作-因此,我似乎可以从本地使用该连接字符串连接到DB。但当我从Cloud Run示例中使用它时,它仍然无法正常工作。感谢您的帮助!

vx6bjr1n

vx6bjr1n1#

看来dart不支持通过unix socket连接,你需要配置一个IP(public或private,根据你的需要)。
或者,您可以使用pg,它支持unix socket connection
希望这对你有帮助。

2lpgd968

2lpgd9682#

只是为了那些谁遇到这个问题在未来:就目前的情况而言,我不得不求助于Daniele Ricci发布的建议,并使用数据库的公共IP。(必须从0. 0. 0. 0/0添加一个授权连接),这是不安全的。在dart的善良开发团队弄清楚如何使用UNIX套接字之前,这似乎是让它工作的唯一方法。

gkl3eglg

gkl3eglg3#

我自己没有实际测试过这个,根据postgres包的源代码,您必须指定您想要一个Unix套接字:

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

默认值为false
你传递的host也必须是有效的。文档说:
[host]必须是主机名,例如“foobar.com“或IP地址。不要包括方案或端口。

vxqlmq5t

vxqlmq5t4#

我也在为同样的问题而挣扎。
解决方案是按如下方式创建连接:

PostgreSQLConnection getProdConnection() {
    final String connectionName = Platform.environment['CLOUD_SQL_CONNECTION_NAME']!;
    final String databaseName = Platform.environment['DB_NAME']!;
    final String user = Platform.environment['DB_USER']!;
    final String password = Platform.environment['DB_PASS']!;
    final String socketPath = '/cloudsql/$connectionName/.s.PGSQL.5432';

    return PostgreSQLConnection(
      socketPath,
      5432,
      databaseName,
      username: user,
      password: password,
      isUnixSocket: true,
    );
  }

然后,当您创建Cloud Run服务时,您需要定义“环境变量”,如下所示。

您还需要在“连接”选项卡中选择SQL示例。

然后,最后需要做的事情是配置Cloud Run服务帐户。

然后,到示例的连接应该成功,并且应该不再需要0.0.0.0/0连接。
但是,如果您在开发期间尝试在Windows设备上本地运行此连接,则将不允许该连接,并将显示以下错误消息:'Unix域套接字在此操作系统上不可用。'
因此,我建议您将Google SQL网络开放到您的公共地址,并使用SQL示例的“公共IP地址”定义一个本地环境。
有关此主题的更多信息,我可以推荐以下资源,它们指导我找到了正确的解决方案:

相关问题