所以我用Amazon Web Services的RDS運行MySQL服務器,並使用Python的瓶框架來運行應用程序服務器和燒瓶的SQLAlchemy與RDS接口。燒瓶的SQLAlchemy:無法重新連接,直到無效事務回滾
我的應用程序config.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')
的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
然後我有一個腳本來填充用於測試目的數據庫後,DB的創建和應用程序啓動:
from application import db
from application.models import Person
person = Person('Bob', 'Jones', '[email protected]')
db.session.add(person)
db.session.commit()
一旦我重新與db.drop_all()和db.create_all(數據庫)我開始application.py然後是腳本來填充數據庫。
服務器將與正確的JSON響應,但如果我以後回來檢查時,我得到我需要回滾或有時在2006年錯誤MySQL服務器已消失的錯誤。
人建議我換超時設置MySQL服務器上,但是這並沒有固定的東西。這裏是我的設置:
innodb_lock_wait_timeout = 3000
max_allowed_packet = 65536
net_write_timeout = 300
wait_timeout = 300
然後,當我看RDS顯示器,它顯示了MySQL服務器保持開放相當長一段時間,直到超時的連接。現在糾正我,如果我錯了,但不是連接應該完成後關閉?看起來應用程序服務器一直在確保數據庫連接存在,然後當MySQL服務器超時時,Flask/Flask-SQLAlchemy會拋出一個錯誤並使應用程序服務器隨之關閉。
任何建議都感激,謝謝!
他在這裏:'db = SQLAlchemy(application)'。你做的是重新初始化。 –
@KanstantsinKamkou是的,但我有相同的設置,這額外的init也爲我修復了它。看看它爲什麼修復它會很有趣。 –
@LeonOverweel那麼在原始郵政的情況下,它的幫助原因是他覆蓋了應用程序的定義,在application.py – Chockomonkey