我在Google App Engine上有一个正在运行的Python 3应用程序(灵活),连接到Google Cloud SQL上的Postgres。我通过遵循文档让它工作,在某些时候,您可以通过 psycopg2 连接到这样的数据库说明符
postgresql://postgres:password@/dbname?host=/cloudsql/project:us-central1:dbhost
我正在尝试了解主机名/cloudsql/project:us-central1:dbhost
的工作原理。谷歌称之为"实例连接字符串",它看起来确实扮演着常规主机名的角色。只有/
和:
它不是 DNS 解析器的有效名称。
谷歌灵活的Python环境是否以某种方式修改以支持这样的特殊主机名?它看起来像股票Python 3和psycopg2,但也许它以某种方式被修改了?如果是这样,这些修改是否记录在任何地方?Python 运行时的文档对此没有任何内容。
事实证明,host=/cloudsql/project:us-central1:dbhost
指定文件系统中目录的名称。该目录中有一个名为.s.PGSQL.5432
的文件,它是一个Unix域套接字。云 SQL 代理的实例正在侦听该 Unix 域套接字,并通过 TCP 将数据库请求转发到实际的数据库服务器。尽管host=
数据库连接字符串,但它实际上命名了一个包含 Unix 套接字的目录;这是 libpq(Postgres 连接库)的一个功能。
非常感谢瓦迪姆在评论中快速回答了我的问题,只是在这里为未来的读者写了一个更完整的答案。