web-dev-qa-db-fra.com

Flask-SQLAlchemy: Impossible de se reconnecter tant que la transaction non valide n'a pas été restaurée

J'utilise donc Amazon Web Services RDS pour exécuter un serveur MySQL et le framework Flask de Python pour exécuter le serveur d'applications et Flask-SQLAlchemy pour assurer l'interface avec le RDS.

Mon application config.py

SQLALCHEMY_DATABASE_URI = '<RDS Host>'
SQLALCHEMY_POOL_RECYCLE = 60

Mon __ init __.py

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

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

J'ai mon application principale.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 __== '__main__':
    application.run(Host='0.0.0.0')

Les 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

J'ai ensuite un script pour remplir la base de données à des fins de test après la création de la base de données et le démarrage de l'application:

from application import db
from application.models import Person

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

Une fois la base de données réinitialisée avec db.drop_all () et db.create_all (), je lance le fichier application.py, puis le script permettant de remplir la base de données.

Le serveur répondra avec le bon JSON, mais si je reviens le vérifier quelques heures plus tard, j'obtiens l'erreur que j'ai besoin d'annuler ou parfois l'erreur 2006 indiquant que le serveur MySQL est parti.

Des personnes m'ont suggéré de modifier les paramètres de délai d'attente sur le serveur MySQL, mais cela n'a rien corrigé. Voici mes paramètres:

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

Ensuite, lorsque je regarde le moniteur RDS, cela montre que le serveur MySQL a maintenu la connexion ouverte pendant un certain temps, jusqu’à l’expiration du délai. Corrigez-moi maintenant si je me trompe, mais la connexion n'est-elle pas censée être fermée une fois terminée? Il semble que le serveur d'applications continue de s'assurer que la connexion à la base de données existe, puis lorsque le serveur MySQL arrive à expiration, Flask/Flask-SQLAlchemy génère une erreur et entraîne le serveur d'applications.

Toutes les suggestions sont appréciées, merci!

12
internetwhy

Je pense qu'est-ce qu'il a ajouté

db.init_app(application)

dans application.py, l’erreur n’a pas eu lieu depuis.

8
internetwhy

À chaque fois, vérifier les retours en arrière ou non est gênant.

J'ai fait insérer, mettre à jour des fonctions qui ont besoin de commettre.

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