使用Python的SQLALCHEMY连接到Cloud SQL(PostgreSQL)时遇到问题

时间:2019-11-18 19:19:23

标签: python postgresql google-cloud-platform sqlalchemy

我在Google Cloud Platform上设置了Cloud SQL实例,并按照官方说明进行操作,但似乎无法连接到Cloud SQL实例。当我尝试进行完整性检查并通过Cloud Shell访问PostgreSQL数据库时,我仍然能够成功连接。

有人可以帮忙吗-我非常有义务。

代码:

from sqlalchemy import create_engine
engine = create_engine('postgresql+psycopg2://<user>:<pass>@<public IP Address/<table>')

engine.connect()

错误:

Is the server running on host "XX.XX.XXX.XX" and accepting
TCP/IP connections on port XXXX?

3 个答案:

答案 0 :(得分:3)

我发现了另一种无需使用Cloud SQL代理即可连接到PostgreSQL GCP实例的方法。

代码:

import sqlalchemy

username = ''  # DB username
password = ''  # DB password
host = ''  # Public IP address for your instance
port = '5432'
database = ''  # Name of database ('postgres' by default)

db_url = 'postgresql+psycopg2://{}:{}@{}:{}/{}'.format(
    username, password, host, port, database)

engine = sqlalchemy.create_engine(db_url)

conn = engine.connect()

在尝试连接之前,我将我的IP地址列入了白名单。 (https://cloud.google.com/sql/docs/postgres/connect-external-app#appaccessIP

答案 1 :(得分:1)

使用Cloud SQL代理从外部应用程序连接到Cloud SQL。

为了实现这一目标,请遵循相关的documentation

所描述的步骤将包括:

  1. 在云控制台上启用Cloud SQL Admin API。
  2. 根据您的操作系统安装相关的代理客户端。
  3. 使用任何可用的方法来authenticate the Cloud SQL Proxy
  4. 在您的终端上使用./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME=tcp:5432 &调用代理,并通过更改代码和使用SQLALCHEMY来连接代理:
from sqlalchemy import create_engine
engine = create_engine('postgresql+psycopg2://DATABASE_USER:PASSWORD@localhost:5432/')

注意:上面的代码假设您没有在生产环境中尝试连接到代理,而是使用authenticated Cloud SDK client来连接到代理。

答案 2 :(得分:0)

根据数据库客户端库,需要指定套接字(/cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432)。

docsSQLAlchemy 提供了以下示例:

db_user = os.environ["DB_USER"]
db_pass = os.environ["DB_PASS"]
db_name = os.environ["DB_NAME"]
db_socket_dir = os.environ.get("DB_SOCKET_DIR", "/cloudsql")
cloud_sql_connection_name = os.environ["CLOUD_SQL_CONNECTION_NAME"]

pool = sqlalchemy.create_engine(

    # Equivalent URL:
    # postgresql+pg8000://<db_user>:<db_pass>@/<db_name>
    #                         ?unix_sock=<socket_path>/<cloud_sql_instance_name>/.s.PGSQL.5432
    sqlalchemy.engine.url.URL.create(
        drivername="postgresql+pg8000",
        username=db_user,  # e.g. "my-database-user"
        password=db_pass,  # e.g. "my-database-password"
        database=db_name,  # e.g. "my-database-name"
        query={
            "unix_sock": "{}/{}/.s.PGSQL.5432".format(
                db_socket_dir,  # e.g. "/cloudsql"
                cloud_sql_connection_name)  # i.e "<PROJECT-NAME>:<INSTANCE-REGION>:<INSTANCE-NAME>"
        }
    ),
    **db_config
)

请注意,此示例中的 pg8000 使用 unix_sock 而不是 unix_socket 作为套接字标识符。