aiohttp+sqlalchemy:在回滚无效事务之前无法重新连接



我正在使用 aiohttpsqlalchemy,并且我创建了一个单身人士,可以帮助我在需要sqlalchemy实例时建立连接(代码如下)。不幸的是,每隔一段时间我都会收到以下错误(我通过重新启动服务器"解决"):

12月11日09:35:29 ip-xxx-xxx-xxx-xxx gunicorn [16513]:sqlalchemy.exc.statementerror :( sqlalchemy.exc.invalidrequesterror)直到无效交易回来后才能重新连接。'... nfrom ... n Whate ... =%(username_1)s n limit%(param_1)s'] [参数:[{}]]````

有什么方法可以修复当前代码?谢谢:)

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 -Block中并执行session.rollback()

之后,您可以恢复会话。

从blask_sqlalchemy用例中到达这里。修复程序是仅运行db.session.rollback()一次,然后清除。它类似于执行Rollback

的接受答案

最新更新