aiohttp+sqlalchemy:在回滚无效事务之前无法重新连接
aiohttp+sqlalchemy: Can't reconnect until invalid transaction is rolled back
我正在使用 aiohttp
和 sqlalchemy
,并且我创建了一个 Singleton,它可以在我需要 SQLAlchemy 实例时帮助我进行连接(代码如下)。
不幸的是,每隔一段时间我就会收到以下错误(我 "solve" 通过重新启动服务器):
Dec 11 09:35:29 ip-xxx-xxx-xxx-xxx gunicorn[16513]: sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back [SQL: '... \nFROM ...\nWHERE ... = %(username_1)s \n LIMIT %(param_1)s'] [parameters: [{}]]```
有什么方法可以修复当前的代码吗?
谢谢:)
CONNECTION_DETAILS = {
'driver': 'pymysql',
'dialect': 'mysql',
'host': os.environ.get('HOST'),
'port': 3306,
'user': 'master',
'password': os.environ.get('PASSWORD'),
'database': 'ourdb',
'charset': 'utf8'
}
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
con_str = '{dialect}+{driver}://{user}:{password}@' \
'{host}:{port}/{database}?charset={charset}'\
.format(**cls.CONNECTION_DETAILS)
try:
engine = sqlalchemy.create_engine(con_str)
Session = scoped_session(sessionmaker(bind=engine))
session = Session() # Create the ORM handle
except sqlalchemy.exc.OperationalError:
logger.exception('Establishing database connection error.')
cls._instance = super().__new__(cls)
logger.debug("Returning database's session.")
cls._instance.session = session
# Initializing tables
cls._instance.Users = Users
cls._instance.Services = Services
cls._instance.APIKeys = APIKeys
return cls._instance
这将是一个相当晚的答案。这就是发生的事情:在使用会话时,会引发 sqlalchemy 错误(任何在用作纯 SQL 时也会引发错误的错误:语法错误、唯一约束、键冲突等)。
您必须找到此错误,将其包装到 try/except
块中并执行 session.rollback()
。
在此之后您可以恢复会话。
来自 flask_sqlalchemy 用例。解决方法是 运行 db.session.rollback()
一次,它就会清除。它类似于执行回滚
的公认答案
我正在使用 aiohttp
和 sqlalchemy
,并且我创建了一个 Singleton,它可以在我需要 SQLAlchemy 实例时帮助我进行连接(代码如下)。
不幸的是,每隔一段时间我就会收到以下错误(我 "solve" 通过重新启动服务器):
Dec 11 09:35:29 ip-xxx-xxx-xxx-xxx gunicorn[16513]: sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back [SQL: '... \nFROM ...\nWHERE ... = %(username_1)s \n LIMIT %(param_1)s'] [parameters: [{}]]```
有什么方法可以修复当前的代码吗? 谢谢:)
CONNECTION_DETAILS = {
'driver': 'pymysql',
'dialect': 'mysql',
'host': os.environ.get('HOST'),
'port': 3306,
'user': 'master',
'password': os.environ.get('PASSWORD'),
'database': 'ourdb',
'charset': 'utf8'
}
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
con_str = '{dialect}+{driver}://{user}:{password}@' \
'{host}:{port}/{database}?charset={charset}'\
.format(**cls.CONNECTION_DETAILS)
try:
engine = sqlalchemy.create_engine(con_str)
Session = scoped_session(sessionmaker(bind=engine))
session = Session() # Create the ORM handle
except sqlalchemy.exc.OperationalError:
logger.exception('Establishing database connection error.')
cls._instance = super().__new__(cls)
logger.debug("Returning database's session.")
cls._instance.session = session
# Initializing tables
cls._instance.Users = Users
cls._instance.Services = Services
cls._instance.APIKeys = APIKeys
return cls._instance
这将是一个相当晚的答案。这就是发生的事情:在使用会话时,会引发 sqlalchemy 错误(任何在用作纯 SQL 时也会引发错误的错误:语法错误、唯一约束、键冲突等)。
您必须找到此错误,将其包装到 try/except
块中并执行 session.rollback()
。
在此之后您可以恢复会话。
来自 flask_sqlalchemy 用例。解决方法是 运行 db.session.rollback()
一次,它就会清除。它类似于执行回滚