无法使Flask-SQLAlchemy连接到我的Google App Engine数据库

时间:2017-04-16 09:25:19

标签: google-app-engine web flask-sqlalchemy google-cloud-sql

我正在尝试使用Google App Engine设置基于Flask的网络应用程序(我是两者都是新手)。 Web应用程序从客户端接收数据,应该将其处理并保存在数据库中。

我尝试使用Flask-SQLAlchemy,但我无法使用Google Cloud SQL进行设置,我使用this guide在同一项目中创建了一个MySQL数据库:

DB on GAE

然后我试图在我的主要python代码上使用它:

app.config('SQLALCHEMY_DATABASE_URI') = 'mysql+mysqldb://root@/Results?unix_socket=/cloudsql/crafty-circlet-164415:psy01'
app.config['SECRET_KEY'] = 'NglfxE8FOP9pgV8fxpyj'
db = SQLAlchemy(app)

class Result(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text)
    profession = db.Column(db.Text)
    year = db.Column(db.Text)
    pressure_level = db.Column(db.Integer)
    reported_suc_count = db.Column(db.Integer)
    marked_suc_count = db.Column(db.Integer)
    real_suc_count = db.Column(db.Integer)
    insertion_time = db.Column(db.DateTime)

    def __init__(self, name, profession, year, pressure_level, reported_suc_count, marked_suc_count, real_suc_count):
        self.name = name
        self.profession = profession
        self.year = year
        self.pressure_level = pressure_level
        self.reported_suc_count = reported_suc_count
        self.marked_suc_count = marked_suc_count
        self.real_suc_count = real_suc_count
        self.insertion_time = datetime.utcnow()

@app.route('/resultform', methods=['POST', 'GET'])
def resultform():
    if request.method == 'POST':
        if not request.form['successmatrices']:
            flash('please fill all the fields', 'error')
        else:
            if 'name' in request.form:
                name = request.form['name']
            else:
                name = None
            if 'profession' in request.form:
                profession = request.form['profession']
            else:
                profession = None
            if 'year' in request.form:
                year = request.form['year']
            else:
                year = None
            if 'pressure_level' in request.form:
                pressure_level = int(request.form['pressure_level'])
            else:
                pressure_level = None
            if 'successmatrices' in request.form:
                successmatrices = int(request.form['successmatrices'])
            else:
                successmatrices = 0
            new_result = Result(name=name, profession=profession, year=year, pressure_level=pressure_level, reported_suc_count=successmatrices, marked_suc_count=len(session['marked']), real_suc_count=len(session['correct']))
            db.session.add(new_result)
            db.session.commit()
            return redirect(url_for('showresults'))
    return render_template("resultform.html")

@app.route('/showresults')
def showresults():
    return render_template("showresults.html", results=Results.query.all())

if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

当我尝试在我的本地开发中运行它(我正在使用PyCharm)时,我在后台收到以下错误:

ERROR    2017-04-16 09:20:19,802 wsgi.py:263] 
Traceback (most recent call last):
  File "C:\Users\<>\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "C:\Users\<>\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "C:\Users\<>\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
  File "C:\Users\<>\PycharmProjects\crafty-circlet-164415\main.py", line 7
    app.config('SQLALCHEMY_DATABASE_URI') = 'mysql+mysqldb://root@/Results?unix_socket=/cloudsql/crafty-circlet-164415:psy01'
SyntaxError: can't assign to function call

在部署到GAE后,出现以下错误:

Error: Server Error
The server encountered an error and could not complete your request.

Please try again in 30 seconds.

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

app.config是一个字典,因此要添加配置值,您将使用[ ]代替(),就像使用app.config['SECRET_KEY']一样。

所以它应该是:

app.config['SQLALCHEMY_DATABASE_URI'] =  SQLALCHEMY_DATABASE_URI

其他一些指针也是成功连接的。您需要正确格式化连接详细信息:

USER = 'root'
PASSWORD = 'your-cloudsql-password'
DATABASE = 'your-cloudsql-database-name'
# connection_name is of the format `project:region:your-cloudsql-instance`
CONNECTION_NAME = 'your-cloudsql-connection-name' 

SQLALCHEMY_DATABASE_URI = (
    'mysql+pymysql://{user}:{password}@localhost/{database}'
    '?unix_socket=/cloudsql/{connection_name}').format(
        user=USER, password=PASSWORD,
        database=DATABASE, connection_name=CONNECTION_NAME)

app.config['SQLALCHEMY_DATABASE_URI'] =  SQLALCHEMY_DATABASE_URI

我可能会将我的秘密和所有其他敏感信息分离到未检入源或使用环境变量等的配置文件中。

如果要使用Cloud SQL实例在本地测试应用程序,则需要安装the Cloud SQL Proxy并将连接名称添加为环境变量,并将MySQLdb库添加到{ {1}}

app.yaml

否则,您可以使用本地MySQL实例进行测试,但在应用引擎上切换到Cloud SQL。

More information on setting up Cloud SQL with App Engine can be found here