2015-06-29 43 views
11

所以我用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會拋出一個錯誤並使應用程序服務器隨之關閉。

任何建議都感激,謝謝!

回答

7

我認爲這樣做是被添加

db.init_app(application) 
在application.py

,因爲還沒有錯誤。

+1

他在這裏:'db = SQLAlchemy(application)'。你做的是重新初始化。 –

+0

@KanstantsinKamkou是的,但我有相同的設置,這額外的init也爲我修復了它。看看它爲什麼修復它會很有趣。 –

+0

@LeonOverweel那麼在原始郵政的情況下,它的幫助原因是他覆蓋了應用程序的定義,在application.py – Chockomonkey

0

另外,使用這種在用於填充數據庫的腳本的末尾:

db.session.close() 

這應該阻止那些煩人的「MySQL服務器消失」的錯誤。

+0

我曾試過這個,但它沒有幫助,我認爲它不起作用,因爲Flask-SQLAlchemy(而不是SQLAlchemy)已經關閉了你的連接。我只是正確地初始化它。自從我調用init_app以來沒有發生錯誤。儘管感謝您的反饋! – PizzaPleb

+0

這可能會幫助別人!?我不得不使用'''和db.session.no_autoflush:'來解決Flask中的一些奇怪問題。結果我的PaaS(Heroku)磕磕絆絆。通過在「with」語句之前放置'''db.session.close()'''解決了這個問題。不愛,但事情正在發揮作用。 –

3

每次檢查回滾或不麻煩..

我做這需要提交插入,更新等功能。

@app.teardown_request 
def session_clear(exception=None): 
    Session.remove() 
    if exception and Session.is_active: 
     Session.rollback() 
+1

Flask-SQLAlchemy [確實](https://github.com/mitsuhiko/flask-sqlalchemy/blob/master/flask_sqlalchemy/__init__.py#L818-L824)它爲你。 –

+0

哦..謝謝!!我不知道,但我不使用flask-sqlalchemy減少軟件包的依賴關係 – leejaycoke

+0

@leejaycoke我使用raw sqlalchemy,並且在Flask-Admin的問題上達到了需要在延長的時間段後需要回滾的狀態。我有一個'Session.remove()'拆除,但會嘗試明天添加這個異常部分 – Busturdust