Flask-SQLAlchemy: не удается повторно подключиться до отмены отката транзакции

147
9

Поэтому я использую Amazon Web Services RDS для запуска сервера MySQL и использования фреймворка Python для запуска сервера приложений и Flask-SQLAlchemy для взаимодействия с RDS.


Мое приложение config.py


SQLALCHEMY_DATABASE_URI = '<RDS Host>'
SQLALCHEMY_POOL_RECYCLE = 60

Мой __ init __. 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')


Model.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


Затем у меня есть script для заполнения базы данных для целей тестирования после создания db и запуска приложения:


from application import db
from application.models import Person

person = Person('Bob', 'Jones', 'bob@website.net')
db.session.add(person)
db.session.commit()


Как только у меня есть reset база данных с db.drop_all() и db.create_all(), я запустил application.py, а затем script, чтобы заполнить базу данных.


Сервер ответит правильным 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 выдает сообщение об ошибке и приносит с собой сервер приложений.


Любые предложения приветствуются, спасибо!

спросил(а) 2015-06-29T20:30:00+03:00 5 лет, 5 месяцев назад
1
Решение
130

Я думаю, что это было добавление


db.init_app(application)

в application.py, с ошибкой не было.

ответил(а) 2015-07-01T04:54:00+03:00 5 лет, 5 месяцев назад
83

Каждый раз, когда вы проверяете откат или нет, возникает проблема.


Я сделал вставку, функции обновления, которые требуют фиксации.

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

ответил(а) 2015-07-07T08:07:00+03:00 5 лет, 4 месяца назад
42

Здесь вы пропустили перезапуск пула, так как MySql закрывает сессию через некоторое время, поэтому вам нужно добавить перезапуск пула, чтобы соединения в пуле переподключались после времени перезапуска пула.

app.config['SQLALCHEMY_POOL_RECYCLE'] = 3600 Надеюсь, это поможет Спасибо

ответил(а) 2019-05-07T06:45:00+03:00 1 год, 6 месяцев назад
-4

В качестве альтернативы используйте это в конце script, который заполняет вашу базу данных:


db.session.close()

Это должно помешать этим неприятным ошибкам "сервер MySQL ушел".

ответил(а) 2015-07-06T18:32:00+03:00 5 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема