2015-06-29 10 views
11

Używam usługi RDS Amazon Web Services do uruchamiania serwera MySQL i korzystania z frameworka Pythona do uruchamiania serwera aplikacji i Flask-SQLAlchemy w celu połączenia z usługą RDS.Flask-SQLAlchemy: Nie można się połączyć, dopóki nie zostanie wycofana nieprawidłowa transakcja

Moja aplikacja config.py

SQLALCHEMY_DATABASE_URI = '<RDS Host>' 
SQLALCHEMY_POOL_RECYCLE = 60 

Moja __ startowych __.py

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 

application = Flask(__name__) 
application.config.from_object('config') 
db = SQLAlchemy(application) 

mam główny 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 

Mam następnie skrypt, aby wypełnić bazę danych dla celów testowych po tworzenie db i uruchomić aplikację:

from application import db 
from application.models import Person 

person = Person('Bob', 'Jones', '[email protected]') 
db.session.add(person) 
db.session.commit() 

Raz ja przywrócić bazę danych z db.drop_all() i db.create_all() Zacznę the application.py, a następnie skrypt do zapełnienia bazy danych.

Serwer odpowie właściwą poprawką JSON, ale jeśli wrócę i sprawdzę go kilka godzin później, pojawi się błąd, który muszę wycofać lub czasami błąd 2006, który serwer MySQL zniknął.

Ludzie zasugerowali, że zmienię ustawienia limitu czasu na serwerze MySQL, ale to niczego nie naprawiło. Oto moje ustawienia:

innodb_lock_wait_timeout = 3000 
max_allowed_packet  = 65536 
net_write_timeout  = 300 
wait_timeout    = 300 

Potem, gdy patrzę na monitorze RDS, to pokazuje, że serwer MySQL utrzymuje połączenie otwarte przez dłuższy czas, aż do limitu czasu. Teraz popraw mnie, jeśli się mylę, ale czy połączenie nie powinno zostać zamknięte po jego zakończeniu? Wygląda na to, że serwer aplikacji upewnia się, że połączenie z bazą danych istnieje, a następnie, gdy serwer MySQL przekroczy limit czasu, Flask/Flask-SQLAlchemy zgłasza błąd i usuwa serwer aplikacji.

Wszelkie sugestie są mile widziane, dzięki!

Odpowiedz

7

myślę co zrobił było dodanie

db.init_app(application) 

w application.py, nie miałem błąd w międzyczasie.

+1

Ma go tutaj: 'db = SQLAlchemy (aplikacja)'. To, co zrobiłeś, to ponownie zainicjować. –

+0

@KanstantsinKamkou yep, ale miałem tę samą konfigurację i ten dodatkowy init naprawił to również dla mnie. Byłoby interesujące zobaczyć, dlaczego to naprawia. –

+0

@LeonOverweel Cóż, w przypadku oryginalnego posta, powodem, dla którego pomógł, jest to, że nadpisał on swoją definicję aplikacji nowym wystąpieniem Flask (__ name__) na linii 6 aplikacji .py – Chockomonkey

0

Alternatywnie, użyj tego na końcu skryptu, który zapełnia bazy danych:

db.session.close() 

To powinno zapobiec te irytujące „serwer MySQL zniknęło” błędy.

+0

Próbowałem tego, ale to nie pomogło i myślę, że to nie zadziałało, ponieważ Flask-SQLAlchemy (w przeciwieństwie do samego SQLAlchemy) już zamyka połączenie dla ciebie. Właśnie go zainicjowałem poprawnie. Nie miałem błędu od kiedy nazwałem init_app. Dzięki za opinie! – PizzaPleb

+0

To może pomóc komuś później !? Musiałem użyć '' 'z db.session.no_autoflush:' '', aby naprawić dziwność w Flasku. W rezultacie mój PaaS (Heroku) potykał się. Umieszczenie '' 'db.session.close()' '' przed instrukcją "with" naprawiło problem. Nie w miłości, ale wszystko działa. –

3

Everytime sprawdzanie wycofywania lub nie jest kłopotliwe ..

zrobiłem funkcji INSERT, UPDATE, które wymagają zatwierdzenia.

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

Flask-SQLAlchemy [robi] (https://github.com/mitsuhiko/flask-sqlalchemy/blob/master/flask_sqlalchemy/__init__.py#L818-L824) dla Ciebie. –

+0

Och ... dzięki !!. Nie wiedziałem o tym, ale nie używam flask-sqlalchemy, aby zmniejszyć zależność pakietów. – leejaycoke

+0

@leejaycoke Używam raw sqlalchemy i mam problem z Flask-Admin, który osiągnął stan wymagający wycofania po dłuższym okresie czasu. Mam odejście 'Session.remove()', ale spróbuję dodać tę sekcję wyjątków jutro – Busturdust

Powiązane problemy