int*_*why 15 python mysql amazon-web-services flask flask-sqlalchemy
因此,我使用Amazon Web Services RDS运行MySQL服务器并使用Python的Flask框架运行应用程序服务器,并使用Flask-SQLAlchemy与RDS进行交互.
我的应用程序config.py
SQLALCHEMY_DATABASE_URI = '<RDS Host>'
SQLALCHEMY_POOL_RECYCLE = 60
Run Code Online (Sandbox Code Playgroud)
我的__ init __.py
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
application = Flask(__name__)
application.config.from_object('config')
db = SQLAlchemy(application)
Run Code Online (Sandbox Code Playgroud)
我有我的主要application.py
from flask import Flask
from application import db
import flask.ext.restless
from application.models import Person
application = Flask(__name__)
application.debug=True
db.init_app(application)
@application.route('/')
def index():
return "Hello, World!"
manager = flask.ext.restless.APIManager(application, flask_sqlalchemy_db=db)
manager.create_api(Person, methods=['GET','POST', 'DELETE'])
if __name__ == '__main__':
application.run(host='0.0.0.0')
Run Code Online (Sandbox Code Playgroud)
models.py
class Person(db.Model):
__bind_key__= 'people'
id = db.Column(db.Integer, primary_key=True)
firstName = db.Column(db.String(80))
lastName = db.Column(db.String(80))
email = db.Column(db.String(80))
def __init__(self, firstName=None, lastName=None, email=None):
self.firstName = firstName
self.lastName = lastName
self.email = email
Run Code Online (Sandbox Code Playgroud)
然后,在创建数据库和应用程序启动后,我有一个脚本来填充数据库以进行测试:
from application import db
from application.models import Person
person = Person('Bob', 'Jones', 'bob@website.net')
db.session.add(person)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
一旦我用db.drop_all()和db.create_all()重置数据库,我启动application.py,然后运行脚本来填充数据库.
服务器将使用正确的JSON进行响应,但如果我回来并在几小时后检查它,则会收到我需要回滚的错误,或者有时会发现MySQL服务器已经消失的2006错误.
人们建议我更改MySQL服务器上的超时设置但是没有修复任何东西.这是我的设置:
innodb_lock_wait_timeout = 3000
max_allowed_packet = 65536
net_write_timeout = 300
wait_timeout = 300
Run Code Online (Sandbox Code Playgroud)
然后,当我查看RDS监视器时,它显示MySQL服务器保持连接打开很长一段时间,直到超时.现在纠正我,如果我错了,但是在完成之后不应该关闭连接?似乎应用程序服务器一直确保数据库连接存在,然后当MySQL服务器超时时,Flask/Flask-SQLAlchemy会抛出错误并使用它关闭应用程序服务器.
任何建议表示赞赏,谢谢!
我认为这是添加了什么
db.init_app(application)
Run Code Online (Sandbox Code Playgroud)
在application.py中,从那以后没有出现过错误.
小智 7
每次检查回滚与否都很麻烦..
我做了插入,更新需要提交的功能。
@app.teardown_request
def session_clear(exception=None):
Session.remove()
if exception and Session.is_active:
Session.rollback()
Run Code Online (Sandbox Code Playgroud)