我在https://cloud.google.com/python/getting-started/tutorial-app
按照Google App Engine(GAE)教程获取了一个书架应用程序虽然我按照指令修改了config.py和app.yaml以连接到数据库,但当我执行代码“python bookshelf / model_cloudsql.py”时,出现以下错误消息:
OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)")
我想这个错误意味着我的cloudSQL服务器没有收听请求,但我尝试通过云端shell连接到我的cloudSQL服务器,它与用户名root和相应的密码配合得很好。
任何人都可以帮忙找出问题所在吗?
非常感谢!
Config.py的代码是:
import os
# The secret key is used by Flask to encrypt session cookies.
SECRET_KEY = 'secret'
# There are three different ways to store the data in the application.
# You can choose 'datastore', 'cloudsql', or 'mongodb'. Be sure to
# configure the respective settings for the one you choose below.
# You do not have to configure the other data backends. If unsure, choose
# 'datastore' as it does not require any additional configuration.
DATA_BACKEND = 'cloudsql'
# Google Cloud Project ID. This can be found on the 'Overview' page at
# https://console.developers.google.com
PROJECT_ID = 'changpei-175109'
# CloudSQL & SQLAlchemy configuration
# Replace the following values the respective values of your Cloud SQL
# instance.
CLOUDSQL_USER = 'root'
CLOUDSQL_PASSWORD = 'XXXXXXXX'
CLOUDSQL_DATABASE = 'novel'
# Set this value to the Cloud SQL connection name, e.g.
# "project:region:cloudsql-instance".
# You must also update the value in app.yaml.
CLOUDSQL_CONNECTION_NAME = 'changpei-175109:asia-northeast1:novel'
# The CloudSQL proxy is used locally to connect to the cloudsql instance.
# To start the proxy, use:
#
# $ cloud_sql_proxy -instances=your-connection-name=tcp:3306
#
# Port 3306 is the standard MySQL port. If you need to use a different port,
# change the 3306 to a different port number.
# Alternatively, you could use a local MySQL instance for testing.
LOCAL_SQLALCHEMY_DATABASE_URI = (
'mysql+pymysql://{user}:{password}@127.0.0.1:3306/{database}').format(
user=CLOUDSQL_USER, password=CLOUDSQL_PASSWORD,
database=CLOUDSQL_DATABASE)
# When running on App Engine a unix socket is used to connect to the cloudsql
# instance.
LIVE_SQLALCHEMY_DATABASE_URI = (
'mysql+pymysql://{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
# Mongo configuration
# If using mongolab, the connection URI is available from the mongolab control
# panel. If self-hosting on compute engine, replace the values below.
MONGO_URI = \
'mongodb://user:password@host:27017/database'
app.yaml是:
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3
#[START cloudsql_settings]
beta_settings:
# If using Cloud SQL, uncomment and set this value to the Cloud SQL
# connection name, e.g.
# "project:region:cloudsql-instance"
# You must also update the values in config.py.
#
cloud_sql_instances: "changpei-175109:asia-northeast1:novel"
#[END cloudsql_settings]
对于model_cloudsql.py是:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
builtin_list = list
db = SQLAlchemy()
def init_app(app):
# Disable track modifications, as it unnecessarily uses memory.
app.config.setdefault('SQLALCHEMY_TRACK_MODIFICATIONS', False)
db.init_app(app)
def from_sql(row):
"""Translates a SQLAlchemy model instance into a dictionary"""
data = row.__dict__.copy()
data['id'] = row.id
data.pop('_sa_instance_state')
return data
# [START model]
class Book(db.Model):
__tablename__ = 'books'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255))
author = db.Column(db.String(255))
publishedDate = db.Column(db.String(255))
imageUrl = db.Column(db.String(255))
description = db.Column(db.String(4096))
createdBy = db.Column(db.String(255))
createdById = db.Column(db.String(255))
def __repr__(self):
return "<Book(title='%s', author=%s)" % (self.title, self.author)
# [END model]
# [START list]
def list(limit=10, cursor=None):
cursor = int(cursor) if cursor else 0
query = (Book.query
.order_by(Book.title)
.limit(limit)
.offset(cursor))
books = builtin_list(map(from_sql, query.all()))
next_page = cursor + limit if len(books) == limit else None
return (books, next_page)
# [END list]
# [START read]
def read(id):
result = Book.query.get(id)
if not result:
return None
return from_sql(result)
# [END read]
# [START create]
def create(data):
book = Book(**data)
db.session.add(book)
db.session.commit()
return from_sql(book)
# [END create]
# [START update]
def update(data, id):
book = Book.query.get(id)
for k, v in data.items():
setattr(book, k, v)
db.session.commit()
return from_sql(book)
# [END update]
def delete(id):
Book.query.filter_by(id=id).delete()
db.session.commit()
def _create_database():
"""
If this script is run directly, create all the tables necessary to run the
application.
"""
app = Flask(__name__)
app.config.from_pyfile('../config.py')
init_app(app)
with app.app_context():
db.create_all()
print("All tables created")
if __name__ == '__main__':
_create_database()