You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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语法。

  1. 先安装库:
pip install async-mssql
  1. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:55:10