SQLAlchemy поддерживает соединение с БД открытым - PullRequest
1 голос
/ 08 мая 2020

В моем приложении 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...