无法使用unix_socket从FAST API容器连接到GCP云SQL

问题描述 投票:0回答:1

运行 FAST API 映像会引发以下错误。

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on None")

我正在使用数据库通过“mysqldb”驱动程序进行异步操作。即使他的数据库凭据正确,连接也没有建立。请提出任何解决方案。

from databases import Database
from utils.const import DB_USER, DB_NAME, DB_PASSWORD, PROJECT_ID, REGION, INSTANCE

# Define the Cloud SQL connection details
SOCKET_PATH = f'/cloudsql/{PROJECT_ID}:{REGION}:{INSTANCE}'

# Create the connection string
DATABASE_URL = f"mysql+mysqldb://{DB_USER}:{DB_PASSWORD}@/{DB_NAME}?unix_socket={SOCKET_PATH}"

# Create the Database object
db = Database(DATABASE_URL)
python fastapi google-cloud-sql mysql-python pymssql
1个回答
0
投票

您可以尝试通过以下几种方法来排查使用 Unix 套接字从 FastAPI 容器到 Cloud SQL 的连接问题:

  1. 确保 Cloud SQL 实例已启动并正在运行。您可以通过运行以下命令来检查这一点:
gcloud sql instances list

这将列出您项目中的所有 Cloud SQL 实例。确保您尝试连接的实例已列出并且状态为

RUNNING

  1. 确保可从 FastAPI 容器访问 Cloud SQL 实例。您可以通过在容器内运行以下命令来完成此操作:
nc -vz 3306

这将尝试连接到端口 3306 上的 Cloud SQL 实例。如果连接成功,您将看到以下输出:

Connection to 3306 succeeded!

如果连接不成功,您将看到以下输出:

nc: connect to 3306 (localhost): Connection refused

如果连接不成功,您必须确保可以从 FastAPI 容器访问 Cloud SQL 实例。您可以通过检查 Cloud SQL 实例的防火墙规则并确保 FastAPI 容器可以访问该实例来完成此操作。

  1. 确保数据库凭据正确。您可以通过在 FastAPI 容器中运行以下命令来检查这一点:
mysql -u <db_user> -p <db_password>

这将尝试使用指定的数据库凭据连接到 Cloud SQL 实例。如果连接成功,系统会提示您输入密码。如果连接不成功,您将看到以下输出:

ERROR 1045 (28000): Access denied for user '<db_user>'@'localhost' (using password: YES)

如果连接不成功,您需要确保数据库凭据正确。您可以通过登录 Cloud SQL 实例并运行以下命令来检查这一点:

SELECT user, host, password FROM mysql.user;

这将列出 Cloud SQL 实例的所有用户和密码。确保此命令的输出中列出了您正在使用的数据库凭据。

  1. 确保 Unix 套接字路径正确。 Unix 套接字路径位于代码中的
    SOCKET_PATH
    变量中。确保此路径正确并且 FastAPI 容器可以访问 Unix 套接字文件。

如果您已检查上述所有内容,但仍然无法连接到 Cloud SQL,您可以尝试以下操作:

  • 重新启动 Cloud SQL 实例。
  • 重新启动 FastAPI 容器。
  • 尝试使用不同的数据库驱动程序,例如 PyMySQL。

如果您在连接到 Cloud SQL 时仍然遇到问题,请联系 Google Cloud 支持寻求帮助。

© www.soinside.com 2019 - 2024. All rights reserved.