我的目标是让一个正在工作的python2.7项目(MySQL+msword文件)在GCP工作。 我意识到我需要
root
用户创建的。在成功创建SQL第二代实例并设置根用户。在
如何运行或部署
我使用云Shell测试应用程序-dev_appserver.py $PWD
,并从cloudshell-gcloud app deploy
部署应用程序。It works at appspot.com直到我尝试在其中使用MySQL连接。在
MySQL连接
MySQL连接代码取自here:
import MySQLdb
import webapp2
CLOUDSQL_CONNECTION_NAME = os.environ.get('CLOUDSQL_CONNECTION_NAME')
CLOUDSQL_USER = os.environ.get('CLOUDSQL_USER')
CLOUDSQL_PASSWORD = os.environ.get('CLOUDSQL_PASSWORD')
DB_NAME='test-db'
def connect_to_cloudsql():
# When deployed to App Engine, the `SERVER_SOFTWARE` environment variable
# will be set to 'Google App Engine/version'.
if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
# Connect using the unix socket located at
# /cloudsql/cloudsql-connection-name.
cloudsql_unix_socket = os.path.join(
'/cloudsql', CLOUDSQL_CONNECTION_NAME)
db = MySQLdb.connect(
unix_socket=cloudsql_unix_socket,
user=CLOUDSQL_USER,
passwd=CLOUDSQL_PASSWORD)
# If the unix socket is unavailable, then try to connect using TCP. This
# will work if you're running a local MySQL server or using the Cloud SQL
# proxy, for example:
#
# $ cloud_sql_proxy -instances=your-connection-name=tcp:3306
#
else:
db = MySQLdb.connect(
host='127.0.0.1', user=CLOUDSQL_USER, passwd=CLOUDSQL_PASSWORD, db=DB_NAME)
return db
db = connect_to_cloudsql()
变量设置在应用程序yaml:
^{pr2}$当应用程序通过dev_appserver.py $PWD
在测试模式下运行并且我选择使用MySQL连接时,出现了一个错误:
ERROR 2018-09-13 08:37:42,492 wsgi.py:263]
Traceback (most recent call last):
...
File "/home/.../mysqldb.py", line 35, in connect_to_cloudsql
host='127.0.0.1', user=CLOUDSQL_USER, passwd=CLOUDSQL_PASSWORD)
File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 204, in __init__
super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (2003, 'Can\'t connect to MySQL server on \'127.0.0.1\' (111 "Connection refused")')
云SQL代理
我已经下载并运行了Win-64(https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe)的云代理,但问题仍然存在。。。似乎代理后台应用程序只用于从本地机器连接到云SQL。在
You do not need to use the proxy or configure SSL to connect to Cloud SQL from the App Engine standard or flexible environment. (source)
为什么连接被拒绝?
我是否应该使用第一代云sql实例来简化与App Engine的连接?
我在云控制台编辑代码,到目前为止,云控制台运行良好。在
我已经通过云Shell成功连接到sql实例:
(coral-heuristic-215610)$ gcloud sql connect db-basic-1 --user=root
Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 48841
Server version: 5.7.14-google-log (Google)
MySQL [(none)]>
comment on a similar issue关系到云SQL实例和App Engine App应该所在的区域,即在同一个区域中。在
就我而言,我检查过:
这些是同一地区的吗?-发现了一个区域的这些区域。在
我本可以打开数据库连接:
DB connection: <_mysql.connection open to '127.0.0.1' at 7f628c02bc00>
但这似乎是在我用同一个项目打开另一个云Shell实例(coral-heuristic-215610)之后发生的。在那个实例中,我已经开始连接到SQL实例,并且成功了:
(coral-heuristic-215610)$ gcloud sql connect db-basic-1 --user=root
Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:
我猜第一个云shell实例开始连接到db是因为第二个实例已经将我的IP列入了白名单,不是吗?在
GAE应用程序和Google云SQL实例必须部署在同一个区域if you’re using MySQL First Generation,否则,我验证了只要使用第二代MySQL,它们就可以位于不同的区域。在
我很难理解你想从哪里联系。我假设您希望使用代理和Cloud SDK Credentials从Google云Shell连接。根据有关Cloud SQL Proxy的文件:
请记住,由于您没有部署应用程序,所以它不会使用您在应用程序yaml. 因此,您必须自己导出并在本地计算机中设置它们:
通过执行
echo $CLOUDSQL_CONNECTION_NAME
验证它们是否已设置。当您使用gcloud app deploy
部署应用程序时,这是不必要的,因为GAE设置了在应用程序yaml. 在在尝试按照these步骤建立连接之前,必须启动代理:
下载代理:
^{pr2}$授予it执行权限:
启动代理,将
<INSTANCE_CONNECTION_NAME>
替换为云SQL实例连接名称:你应该在结尾看到类似的内容:
此时,您可以从GoogleCloud Shell instance连接到本地运行的代理服务器,该代理又将您连接到云SQL实例。在
打开另一个Cloud Shell session(或制表符)并用
python myapp.py
启动代码。您将连接到本地运行的代理。您也可以通过运行mysql -h 127.0.0.1 user=root -p
来测试连接。在我通过添加应用程序yaml以下内容:
相关问题 更多 >
编程相关推荐