SQLAlchemy异步引擎:async with的try-except-finally等效写法咨询
问题解答
你的需求完全可行——用try-except-finally替代async with来管理SQLAlchemy异步连接,还能把连接对象传递给类的其他方法复用。你遇到的错误核心是异步代码的写法问题,以下是具体解决方法:
正确的等效写法
针对SQLAlchemy异步引擎,替换async with的手动资源管理代码如下:
async def myfunc(): connection = None try: # 重点:connect()是异步方法,必须用await拿到实际连接 connection = await self.__engine.connect() # 直接把连接传给其他异步函数使用 await someFn(connection, *你的参数) # 如果涉及事务,这里可以加提交:await connection.commit() except Exception as e: # 可选:异常时回滚事务(如果用了事务连接) # if connection: # await connection.rollback() raise e # 按需处理或抛出异常 finally: # 关闭连接也必须用await,因为是异步操作 if connection: await connection.close()
必须注意的两个点
- 获取连接要加
await:你之前直接写connection = self.__engine.connect(),拿到的只是一个协程对象,不是实际的数据库连接,这就是报错“非异步块中调用connection”的根源。 - 关闭连接也要
await:异步连接的close()方法是异步操作,必须用await执行才能正确释放资源。
关于连接传递到其他方法
只要你的其他方法是异步函数,并且在使用连接时,所有数据库操作都用await(比如await connection.execute(你的SQL语句)),就可以安全地把connection对象传递过去复用,不用在每个方法里都写async with。
内容的提问来源于stack exchange,提问作者Dave S
相关产品推荐
相关产品推荐

