我在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示例中使用它时,它仍然无法正常工作。感谢您的帮助!
4条答案
按热度按时间vx6bjr1n1#
看来dart不支持通过unix socket连接,你需要配置一个IP(public或private,根据你的需要)。
或者,您可以使用pg,它支持unix socket connection
希望这对你有帮助。
2lpgd9682#
只是为了那些谁遇到这个问题在未来:就目前的情况而言,我不得不求助于Daniele Ricci发布的建议,并使用数据库的公共IP。(必须从0. 0. 0. 0/0添加一个授权连接),这是不安全的。在dart的善良开发团队弄清楚如何使用UNIX套接字之前,这似乎是让它工作的唯一方法。
gkl3eglg3#
我自己没有实际测试过这个,根据postgres包的源代码,您必须指定您想要一个Unix套接字:
默认值为
false
。你传递的
host
也必须是有效的。文档说:[host]必须是主机名,例如“foobar.com“或IP地址。不要包括方案或端口。
vxqlmq5t4#
我也在为同样的问题而挣扎。
解决方案是按如下方式创建连接:
然后,当您创建Cloud Run服务时,您需要定义“环境变量”,如下所示。
您还需要在“连接”选项卡中选择SQL示例。
然后,最后需要做的事情是配置Cloud Run服务帐户。
然后,到示例的连接应该成功,并且应该不再需要0.0.0.0/0连接。
但是,如果您在开发期间尝试在Windows设备上本地运行此连接,则将不允许该连接,并将显示以下错误消息:'Unix域套接字在此操作系统上不可用。'
因此,我建议您将Google SQL网络开放到您的公共地址,并使用SQL示例的“公共IP地址”定义一个本地环境。
有关此主题的更多信息,我可以推荐以下资源,它们指导我找到了正确的解决方案: