Я пытаюсь сделать приложение 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. Никто из них не помог.