sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2006, «сервер MySQL ушел») - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь сделать приложение flask для работы с некоторыми ботами. Я подключил MySQL базу данных, которая включает в себя несколько таблиц. Я использую SQLAlchemy для работы с базой данных (не flask-sqlachemy, потому что я использую свою базу данных и для своих ботов, и будет трудно получить доступ из других модулей). Боты запускаются в новых процессах с модулем multiprocessing.Process. Все примеры приведены ниже. Я искал различные решения, как справиться с sessions с SQLAlchemy. Теперь я использую метод с созданием session для каждого запроса с @contextmanager:

new_engine = create_engine('mysql://username:password@localhost/db_name', pool_pre_ping=True, pool_recycle=280)
SessionAccounts = scoped_session(sessionmaker(bind=new_engine))

@contextmanager
def session_scope():
    session = SessionAccounts()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise

Я также использовал метод session_scope() с

finally:
    session.close()

Идея от Документация по SQLAlchemy .

Вот пример функции, которую я использую и которая возвращает ошибку.

def add_token(value):
    with session_scope() as db_session:
        try:
            new_token = Tokens(value=value, received=datetime.datetime.now())
            db_session.add(new_token)
            return True
        except Exception as exp:
            return False

Но всегда после случайного тайм-аута и случайного числа вставок Iполучать сообщение об ошибке в первый раз и в следующий раз каждый раз, когда я пытаюсь сделать вставку:

[SQL: INSERT INTO tokens (value, received) VALUES (%s, %s)]
[parameters: ('LONG STRING about 500 characters', datetime.datetime(2019, 9, 29, 18, 40, 19, 778298))]

Да, я обрабатываю это Exception, но я просто потерял свои данные, поэтому это не помогает.

Это не первая моя попытка справиться с отключениями. До того как я использовал один session, который я инициализировал при глобальном запуске приложения. И затем использовал их. Но он вернул ту же ошибку. Поэтому я искал новые решения. Одним из них является этот. И это должно работать. Каждый раз, когда я начинаю новый session. Выполните некоторые запросы, такие как select, add, delete. Если после каждого запроса зафиксировано исключение, в противном случае выполняется откат. Но через 1-2 минуты работы, если начать, верните мне ошибку.

Знаете ли вы лучший способ обработки сеансов? Как я могу получить доступ к базе данных MySQL из нескольких процессов и правильно обработать sessions? Я искал различные решения также на stackoverflow.com. Никто из них не помог.

...