因此,我使用 Amazon Web Services RDS 来运行 MySQL 服务器,并使用 Python 的 Flask 框架来运行应用程序服务器,并使用 Flask-SQLAlchemy 来与 RDS 交互。
我的应用配置.py
SQLALCHEMY_DATABASE_URI = '<RDS Host>'
SQLALCHEMY_POOL_RECYCLE = 60
我的 __ 初始化 __.py
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
application = Flask(__name__)
application.config.from_object('config')
db = SQLAlchemy(application)
我有我的主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')
模型.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
然后我有一个脚本来填充数据库以在数据库创建和应用程序启动后进行测试:
from application import db
from application.models import Person
person = Person('Bob', 'Jones', 'bob@website.net')
db.session.add(person)
db.session.commit()
使用 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
然后当我查看 RDS 监视器时,它显示 MySQL 服务器保持连接打开了很长一段时间,直到超时。如果我错了,请纠正我,但连接完成后不应该关闭吗?应用服务器似乎一直在确保数据库连接存在,然后当 MySQL 服务器超时时,Flask/Flask-SQLAlchemy 抛出错误并关闭应用服务器。
感谢任何建议,谢谢!
最佳答案
我认为它添加了什么
db.init_app(application)
在 application.py 中,从那以后就没有错误了。
关于python - Flask-SQLAlchemy:在回滚无效事务之前无法重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121948/