簡體   English   中英

從雲功能連接到雲 sql 時出現 Python 錯誤

[英]Python error while connecting to cloud sql from cloud functions

我正在嘗試使用Python代碼從GCP Cloud functions連接到PostgreSQL CloudSQL 我是python的新手,所以遇到了一些錯誤,需要幫助來修復錯誤

我的代碼如下:

# Don't add the "/.s.PGSQL.5432 suffix" because it will already be added back automatically by the library...
import psycopg2
import sqlalchemy
from sqlalchemy import create_engine

engine = sqlalchemy.create_engine('postgresql+psycopg2://postgres:a1b2c3d4e190@X.X.X.X/postgres_dbase')
print("connected")

function 部署良好,但 URL 失敗並出現以下錯誤

  Error: could not handle the request

它在日志中顯示以下錯誤

  Details:'Request' object has no attribute '_instantiate_plugins'

當我直接執行代碼時它工作正常

   $ python3 open.py
    connected

我正在使用Python 3.7

更新

看起來我必須設置 DATABASE_URL 但不確定如何在 CLoud 函數中設置它。 Cloud functions中的Runtime environmental variable下方添加但沒有運氣

 DATABASE_URL="sqlite://"

https://github.com/sqlalchemy/sqlalchemy/issues/5330

不確定您是嘗試從公共 IP 還是從私人連接。 但是,您可以在此處找到有關如何使用 Public IP 執行您的關注的示例。 你的代碼應該看起來像

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:
    # postgres+pg8000://<db_user>:<db_pass>@/<db_name>
    #                         ?unix_sock=<socket_path>/<cloud_sql_instance_name>/.s.PGSQL.5432
    sqlalchemy.engine.url.URL(
        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
)

另一方面,如果您使用的是 Private IP,您的代碼中應該有類似這樣的內容

db_user = os.environ["DB_USER"]
db_pass = os.environ["DB_PASS"]
db_name = os.environ["DB_NAME"]
db_host = os.environ["DB_HOST"]

# Extract host and port from db_host
host_args = db_host.split(":")
db_hostname, db_port = host_args[0], int(host_args[1])

pool = sqlalchemy.create_engine(
    # Equivalent URL:
    # postgres+pg8000://<db_user>:<db_pass>@<db_host>:<db_port>/<db_name>
    sqlalchemy.engine.url.URL(
        drivername="postgresql+pg8000",
        username=db_user,  # e.g. "my-database-user"
        password=db_pass,  # e.g. "my-database-password"
        host=db_hostname,  # e.g. "127.0.0.1"
        port=db_port,  # e.g. 5432
        database=db_name  # e.g. "my-database-name"
    ),
    **db_config
)

根據您使用的是Public IP還是Private IP ,請確保您已配置 Cloud Functions。

這適用於我將 Google App Engine 連接到來自 Google Cloud Platform 的 PostgreSQL 實例。

import psycopg2

try:
    conn = psycopg2.connect(dbname='your_data_base_name', user='your_data_base_user', password='your_data_base_user_password', host='/cloudsql/project_name:region:database_instance_name')

except psycopg2.Error as e:
    print("Error: Could not make connection to the Postgres database")
    print(e)
cur = conn.cursor()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM