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!
Ma go tutaj: 'db = SQLAlchemy (aplikacja)'. To, co zrobiłeś, to ponownie zainicjować. –
@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. –
@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