python - aiohttp+sqlalchemy : Can't reconnect until invalid transaction is rolled back

标签 python python-3.x sqlalchemy pymysql aiohttp

我正在使用 aiohttpsqlalchemy,并且我创建了一个 Singleton,它可以在我需要 SQLAlchemy 实例时帮助我连接(代码如下) . 不幸的是,每隔一段时间我就会收到以下错误(我通过重新启动服务器来“解决”):

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

最佳答案

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

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

在此之后您可以恢复您的 session 。

关于python - aiohttp+sqlalchemy : Can't reconnect until invalid transaction is rolled back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41086632/

相关文章:

python - 如何在 Python 3 中制作一个不断要求从命令列表中输入的远程控制?

Python pandas 查找开始/结束行和舍入数

python - 战舰: How to automate instances creation?

python-3.x - Plotly 散点图趋势线出现在散点下方。如何让趋势线出现在散点图上? [Python]

python - Sqlalchemy 似乎在不应该的时候提交了更改

postgresql - Flask 应用程序 AWS Postgres 连接在本地工作但在 Heroku 上不工作

python - 如何从元组列表中删除重复项但保持原始顺序

python - 如何只匹配其中只有数字的单词周围的引号?

python - 登录 Behave BDD 框架

python - 接受表名和列名并返回与给定过滤器值匹配的所有主键值的通用函数