我有一个postgresql Google Cloud SQL实例,我正试图将运行在Google Cloud Run中的FastAPI应用程序连接到它,但我遇到了ConnectionRefusedError: [Errno 111] Connection refused
错误。
我的应用程序使用数据库包进行异步数据库连接:
database = databases.Database(sqlalchemy_database_uri)
然后尝试在应用程序启动时通过连接
@app.on_event("startup")
async def startup() -> None:
if not database.is_connected:
await database.connect() <--- this is where the error is raised
通过阅读这里的文档,它建议形成这样的连接字符串:
"postgresql+psycopg2://user:pass@/dbname?unix_sock=/cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/.s.PGSQL.5432"
我尝试了几种不同的url变体,使用host
而不是sqlalchemy文档建议的unix_sock
,以及删除最后的.s.PGSQL.5432
,正如我看到的其他SO帖子所建议的那样,但都无济于事。
我已经在Cloud Run面板中将Cloud SQL连接添加到实例中,并将Cloud SQL Client角色添加到服务帐户中。
我可以使用Cloud SQL Auth Proxy在本地连接到数据库。
我有点不知所措,不知道如何修复它,甚至不知道如何调试它,因为似乎没有任何简单的方法可以将ssh放入容器并尝试一些东西。如有任何帮助,我们将不胜感激,谢谢!
更新
我可以使用直接连接sqlalchemy
from sqlalchemy import create_engine
engine = create_engine(url)
engine.connect()
其中url是以下任何格式:
"postgresql://user:pass@/db_name?host=/cloudsql/PROJECT_ID:REGION:INSTANCE_NAME"
"postgresql+psycopg2://user:pass@/db_name?host=/cloudsql/PROJECT_ID:REGION:INSTANCE_NAME"
"postgresql+pg8000://user:pass@/db_name?unix_sock=/cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/.s.PGSQL.5432"
databases
的异步特性是否导致了问题?
发现这是databases
包的一个错误。现在应该用https://github.com/encode/databases/pull/423