Python Bookshelf 应用在使用 postgresql 云部署到 GCP 时出错 SQL 数据库
Python Bookshelf App giving error on deployment to GCP using postgresql cloud SQL DB
我正在使用 postgresSQL 云 SQL 数据库部署 GCP Python Bookshelf 应用程序。
我的应用程序 运行 不正确。错误日志如下图所示。
我已在 app.yaml、requirements.txt 和 config.py 文件中完成所有必需的更改。
该项目 运行 在本地使用 cloud-sql-proxy 正常,但在部署版本中无法正常工作。有人可以指导我如何解决这个问题吗?
我在app.yaml中的环境变量是:
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3
#[START cloudsql_settings]
beta_settings:
cloud_sql_instances: "<my_project_id>:<region_name>:<cloudsql_instance>"
# cloud_sql_instances: "your-cloudsql-connection-name"
#[END cloudsql_settings]
config.py是:
import os
DATA_BACKEND = 'cloudsql'
PROJECT_ID = '<my_project_id>'
CLOUDSQL_USER = '<username>'
CLOUDSQL_PASSWORD = '<password>'
CLOUDSQL_DATABASE = '<db_name>'
CLOUDSQL_CONNECTION_NAME = '<my_project_id>:<region_name>:<cloudsql_instance>'
LOCAL_SQLALCHEMY_DATABASE_URI = (
'postgresql+psycopg2://{user}:{password}@127.0.0.1:3306/{database}').format(
user=CLOUDSQL_USER, password=CLOUDSQL_PASSWORD,
database=CLOUDSQL_DATABASE)
LIVE_SQLALCHEMY_DATABASE_URI = (
'postgres://{user}:{password}@localhost/{database}'
'?unix_socket=/cloudsql/{connection_name}').format(
user=CLOUDSQL_USER, password=CLOUDSQL_PASSWORD,
database=CLOUDSQL_DATABASE, connection_name=CLOUDSQL_CONNECTION_NAME)
if os.environ.get('GAE_INSTANCE'):
SQLALCHEMY_DATABASE_URI = LIVE_SQLALCHEMY_DATABASE_URI
else:
SQLALCHEMY_DATABASE_URI = LOCAL_SQLALCHEMY_DATABASE_URI
requirements.txt是:
Flask>=1.0.0
google-cloud-datastore==1.7.1
gunicorn==19.9.0
Flask-SQLAlchemy==2.3.2
psycopg2==2.8.4
PyMySQL==0.9.2
Flask-PyMongo>=2.0.0
oauth2client==4.1.2
PyMongo==3.7.2
six==1.11.0
详细错误是:
Traceback (most recent call last):
File "/env/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2275, in _wrap_pool_connect
return fn()
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 363, in connect
return _ConnectionFairy._checkout(self)
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 760, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 492, in checkout
rec = pool._do_get()
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/impl.py", line 139, in _do_get
self._dec_overflow()
File "/env/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "/env/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 153, in reraise
raise value
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/impl.py", line 136, in _do_get
return self._create_connection()
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 308, in _create_connection
return _ConnectionRecord(self)
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 437, in __init__
self.__connect(first_connect_check=True)
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 639, in __connect
connection = pool._invoke_creator(self)
File "/env/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
return dialect.connect(*cargs, **cparams)
File "/env/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 481, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/env/lib/python3.6/site-packages/psycopg2/__init__.py", line 125, in connect
dsn = _ext.make_dsn(dsn, **kwargs)
File "/env/lib/python3.6/site-packages/psycopg2/extensions.py", line 174, in make_dsn
parse_dsn(dsn)
psycopg2.ProgrammingError: invalid dsn: invalid connection option "unix_socket"
您在使用 postgresql+psycopg2://username:password@/db?unix_socket=/cloudsql/project-name:region:dbinstance
吗?
尝试使用 postgres://
而不是 postgresql+psycopg2//:
您向我们提供的信息越多,关于您的连接或任何其他信息,我们就越能尝试帮助您。这就是你所依据的 tutorial 吗?
编辑:
嘿,如果您仔细检查每个连接都正常,请将 Cloud SQL 客户端角色添加到您的应用引擎服务帐户,如果这为您解决了问题,请告诉我。
LIVE_SQLALCHEMY_DATABASE_URI = ( 'postgres://{user}:{password}@localhost/{database}' '?host=/cloudsql/{connection_name}')。
我不得不在 LIVE_SQLALCHEMY_DATABASE_URI 中 将 unix_socket 替换为主机 。也只需要 postgres。
我不知道是否需要,但我还向我的应用引擎服务帐户添加了云 SQL 客户端角色。
感谢大家的帮助。
仅供参考,此语法适用于在 Cloud SQL 中使用 PostgreSQL 实例的 App Engine 部署,使用 pg8000 驱动程序:
connection_string = sqlalchemy.engine.url.URL(
drivername="postgres+pg8000",
username=username,
password=password,
database=database,
query="unix_sock": "/cloudsql/{}/.s.PGSQL.5432".format(instance),
)
connection = sqlalchemy.create_engine(
connection_string,
pool_size=50,
max_overflow=2,
pool_timeout=30,
pool_recycle=1800,
)
我正在使用 postgresSQL 云 SQL 数据库部署 GCP Python Bookshelf 应用程序。 我的应用程序 运行 不正确。错误日志如下图所示。
我已在 app.yaml、requirements.txt 和 config.py 文件中完成所有必需的更改。 该项目 运行 在本地使用 cloud-sql-proxy 正常,但在部署版本中无法正常工作。有人可以指导我如何解决这个问题吗?
我在app.yaml中的环境变量是:
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3
#[START cloudsql_settings]
beta_settings:
cloud_sql_instances: "<my_project_id>:<region_name>:<cloudsql_instance>"
# cloud_sql_instances: "your-cloudsql-connection-name"
#[END cloudsql_settings]
config.py是:
import os
DATA_BACKEND = 'cloudsql'
PROJECT_ID = '<my_project_id>'
CLOUDSQL_USER = '<username>'
CLOUDSQL_PASSWORD = '<password>'
CLOUDSQL_DATABASE = '<db_name>'
CLOUDSQL_CONNECTION_NAME = '<my_project_id>:<region_name>:<cloudsql_instance>'
LOCAL_SQLALCHEMY_DATABASE_URI = (
'postgresql+psycopg2://{user}:{password}@127.0.0.1:3306/{database}').format(
user=CLOUDSQL_USER, password=CLOUDSQL_PASSWORD,
database=CLOUDSQL_DATABASE)
LIVE_SQLALCHEMY_DATABASE_URI = (
'postgres://{user}:{password}@localhost/{database}'
'?unix_socket=/cloudsql/{connection_name}').format(
user=CLOUDSQL_USER, password=CLOUDSQL_PASSWORD,
database=CLOUDSQL_DATABASE, connection_name=CLOUDSQL_CONNECTION_NAME)
if os.environ.get('GAE_INSTANCE'):
SQLALCHEMY_DATABASE_URI = LIVE_SQLALCHEMY_DATABASE_URI
else:
SQLALCHEMY_DATABASE_URI = LOCAL_SQLALCHEMY_DATABASE_URI
requirements.txt是:
Flask>=1.0.0
google-cloud-datastore==1.7.1
gunicorn==19.9.0
Flask-SQLAlchemy==2.3.2
psycopg2==2.8.4
PyMySQL==0.9.2
Flask-PyMongo>=2.0.0
oauth2client==4.1.2
PyMongo==3.7.2
six==1.11.0
详细错误是:
Traceback (most recent call last):
File "/env/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2275, in _wrap_pool_connect
return fn()
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 363, in connect
return _ConnectionFairy._checkout(self)
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 760, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 492, in checkout
rec = pool._do_get()
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/impl.py", line 139, in _do_get
self._dec_overflow()
File "/env/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "/env/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 153, in reraise
raise value
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/impl.py", line 136, in _do_get
return self._create_connection()
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 308, in _create_connection
return _ConnectionRecord(self)
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 437, in __init__
self.__connect(first_connect_check=True)
File "/env/lib/python3.6/site-packages/sqlalchemy/pool/base.py", line 639, in __connect
connection = pool._invoke_creator(self)
File "/env/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
return dialect.connect(*cargs, **cparams)
File "/env/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 481, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/env/lib/python3.6/site-packages/psycopg2/__init__.py", line 125, in connect
dsn = _ext.make_dsn(dsn, **kwargs)
File "/env/lib/python3.6/site-packages/psycopg2/extensions.py", line 174, in make_dsn
parse_dsn(dsn)
psycopg2.ProgrammingError: invalid dsn: invalid connection option "unix_socket"
您在使用 postgresql+psycopg2://username:password@/db?unix_socket=/cloudsql/project-name:region:dbinstance
吗?
尝试使用 postgres://
而不是 postgresql+psycopg2//:
您向我们提供的信息越多,关于您的连接或任何其他信息,我们就越能尝试帮助您。这就是你所依据的 tutorial 吗?
编辑:
嘿,如果您仔细检查每个连接都正常,请将 Cloud SQL 客户端角色添加到您的应用引擎服务帐户,如果这为您解决了问题,请告诉我。
LIVE_SQLALCHEMY_DATABASE_URI = ( 'postgres://{user}:{password}@localhost/{database}' '?host=/cloudsql/{connection_name}')。
我不得不在 LIVE_SQLALCHEMY_DATABASE_URI 中 将 unix_socket 替换为主机 。也只需要 postgres。
我不知道是否需要,但我还向我的应用引擎服务帐户添加了云 SQL 客户端角色。 感谢大家的帮助。
仅供参考,此语法适用于在 Cloud SQL 中使用 PostgreSQL 实例的 App Engine 部署,使用 pg8000 驱动程序:
connection_string = sqlalchemy.engine.url.URL(
drivername="postgres+pg8000",
username=username,
password=password,
database=database,
query="unix_sock": "/cloudsql/{}/.s.PGSQL.5432".format(instance),
)
connection = sqlalchemy.create_engine(
connection_string,
pool_size=50,
max_overflow=2,
pool_timeout=30,
pool_recycle=1800,
)