我正在尝试制作flask
应用来处理一些机器人。我已经连接了MySQL
数据库,其中包括几个表。我正在使用SQLAlchemy
和数据库一起工作(而不是flask-sqlachemy
,因为我也将我的数据库也用于我的机器人,并且很难从其他模块进行访问)。 Bot正在使用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()
这是我正在使用的函数的示例,并且返回错误。
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
但是总是在随机超时和随机插入之后,每次尝试插入时,我第一次和下一次都收到错误:
[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上寻找不同的解决方案。没有人帮助。