我在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?
答案 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。
所描述的步骤将包括:
./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
)。
docs 为 SQLAlchemy
提供了以下示例:
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
作为套接字标识符。