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

Inf*_*ity 12 python sqlalchemy python-3.x pymysql aiohttp

我使用的是aiohttpsqlalchemy,和我创建了一个单身,帮助我,当我需要的SQLAlchemy(代码如下)的实例连接.不幸的是,每隔一段时间我就会收到以下错误(我通过重启服务器"解决"):

12月11日09:35:29 ip-xxx-xxx-xxx-xxx gunicorn [16513]:sqlalchemy.exc.StatementError:(sqlalchemy.exc.InvalidRequestError)在无效事务回滚之前无法重新连接[SQL:'.. .\nFROM ... \nWHERE ... =%(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
Run Code Online (Sandbox Code Playgroud)

kni*_*tti 9

这将是一个相当晚的答案.发生这种情况:在使用会话时,会引发sqlalchemy错误(任何在用作纯SQL时也会引发错误:语法错误,唯一约束,键冲突等).

您必须找到此错误,将其包装到try/except-block中并执行session.rollback().

在此之后,您可以恢复会话.

  • 我在使用直接SQLAlchemy和MS SQL Server时遇到了这个问题。在空的Jupyter单元中运行`session.rollback()`可以修复问题。 (2认同)

Pat*_*uku 5

从 Flask_sqlalchemy 用例得到这里。修复方法是只运行db.session.rollback()一次就可以清除。它类似于执行回滚的接受答案

  • 你在哪里称呼它? (3认同)