如何用Python异步连接查询Azure SQL数据库?解决__aenter__报错
解决Python异步连接Azure SQL数据库的问题
错误原因
你遇到的AttributeError: __aenter__是因为pyodbc是纯同步库,它的连接对象和游标对象都没有实现异步上下文管理器所需的__aenter__/__aexit__方法,也没有异步版本的execute方法,直接用async with和await调用同步库的API必然会报错。另外你之前尝试的asyncpg是专门为PostgreSQL设计的库,和Azure SQL(SQL Server)不兼容,所以也无法使用。
可行方案
方案一:使用异步SQL Server专用库(async-mssql)
async-mssql是基于pymssql封装的异步SQL Server客户端,完全支持asyncio语法。
- 先安装库:
pip install async-mssql
- 示例代码:
import asyncio import asyncmssql async def query_azure_sql_db(): connection_params = { 'server': '<mySERVER>.database.windows.net', 'port': 1433, 'user': '<myUN>', 'password': '<myPW>', 'database': 'sqldbstockdata', 'encrypt': True, 'trust_server_certificate': False, 'timeout': 30 } async with asyncmssql.connect(**connection_params) as conn: async with conn.cursor() as cursor: query = 'SELECT * FROM dbo.<myTABLE>' await cursor.execute(query) results = await cursor.fetchall() return results if __name__ == '__main__': results = asyncio.run(query_azure_sql_db()) print(results)
方案二:用pyodbc结合asyncio线程池执行同步操作
如果不想更换现有库,可以把pyodbc的同步操作放到asyncio.run_in_executor中,借助线程池实现异步调用:
import asyncio import pyodbc from concurrent.futures import ThreadPoolExecutor # 初始化线程池 executor = ThreadPoolExecutor(max_workers=5) def sync_query(): connection_string = 'Driver={ODBC Driver 17 for SQL Server};Server=tcp:<mySERVER>.database.windows.net,1433;Database=sqldbstockdata;Uid=<myUN>;Pwd=<myPW>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;' with pyodbc.connect(connection_string) as conn: with conn.cursor() as cursor: query = 'SELECT * FROM dbo.<myTABLE>' cursor.execute(query) return cursor.fetchall() async def query_azure_sql_db(): loop = asyncio.get_running_loop() # 把同步函数放到线程池执行 results = await loop.run_in_executor(executor, sync_query) return results if __name__ == '__main__': results = asyncio.run(query_azure_sql_db()) print(results)
注意事项
- 方案一的
async-mssql需要确保你的环境安装了FreeTDS依赖(部分Linux系统可能需要手动安装:sudo apt install freetds-dev)。 - 方案二中的线程池大小可以根据你的并发需求调整,避免创建过多线程导致资源耗尽。
内容的提问来源于stack exchange,提问作者SeaDude
相关产品推荐
相关产品推荐

