В моем приложении Flask возникла проблема, связанная с SQLAlchemy и MySQL. В одном из моих файлов: connection.py
У меня есть функция, которая создает соединение с БД и устанавливает его как глобальную переменную:
db = None
def db_connect(force=False):
global db
db = pymysql.connect(.....)
def makecursor():
cursor = db.cursor(pymysql.cursors.DictCursor)
return db, cursor
И затем у меня есть Пользователь Модель, созданная с помощью SQL ALchemy models.ppy
class User(Model):
id = column........
Он наследуется от модели, которая является классом, который я создаю в другом файле orm.py
import connection
Engine = create_engine(url, creator=lambda x: connection.makecursor()[0], pool_pre_ping=True)
session_factory = sessionmaker(bind=Engine, autoflush=autoflush)
Session = scoped_session(session_factory)
class _Model:
query = Session.query_property()
Model = declarative_base(cls=_Model, constructor=model_constructor)
В моем приложении я могу иметь длинный скрипт работает так тайм-аут БД. Итак, у меня есть функция, которая «повторно подключает» мою БД (на самом деле она только создает новое соединение и заменяет глобальную переменную БД)
Моя цель - иметь возможность поймать закрытие моей БД и мгновенно переподключить ее. Я пробовал с событиями SQLAlchemy, но это не сработало. ( здесь )
Вот строка, в которой воспроизводится ошибка:
res = User.query.filter_by(username="myuser@gmail.com").first()
connection.db.close()
# connection.reconnect() # --> SOLUTION
res = User.query.filter_by(username="myuser@gmail.com").first()
Если у вас есть идеи, как этого добиться, дайте мне знать ?? Да, и я забыл, это приложение все еще работает с python2.7
.