Python无法将Azure SQL表转换为Pandas DataFrame求助
问题分析
报错根源是调用pd.read_sql时传入了ODBC原生连接字符串conxn,新版本pandas的read_sql函数若接收字符串参数,会默认通过SQLAlchemy解析为数据库URL,但ODBC连接字符串不符合SQLAlchemy的URL格式规范,导致解析失败。
你已经通过pyodbc成功建立了连接对象conn,完全可以直接复用这个已有的连接完成DataFrame转换。
修复方案
修改pd.read_sql的第二个参数,将conxn替换为已建立的连接对象conn即可:
import pyodbc import pandas as pd server = 'xxxx.database.windows.net' database = 'xxx' username = 'bxxxx' password = 'bxxx' conxn = 'Driver={ODBC Driver 18 for SQL Server};Server='+server+';Database='+database+';Encrypt=yes;UID='+username+';Pwd='+password+';TrustServerCertificate=no;Connection Timeout=30' # 已成功建立的连接对象 conn = pyodbc.connect(conxn) cursor = conn.cursor() query = "SELECT * FROM dbo.outsource;" # 传入连接对象conn而非连接字符串conxn df = pd.read_sql(query, conn) print(df.head(10))
可选方案(SQLAlchemy方式)
若希望用SQLAlchemy管理连接,需将ODBC连接字符串转换为SQLAlchemy兼容的URL格式,示例如下:
from sqlalchemy import create_engine import pandas as pd # 构造SQLAlchemy兼容的URL connection_url = f"mssql+pyodbc://{username}:{password}@{server}/{database}?driver=ODBC+Driver+18+for+SQL+Server&encrypt=yes&TrustServerCertificate=no&Connection+Timeout=30" engine = create_engine(connection_url) query = "SELECT * FROM dbo.outsource;" df = pd.read_sql(query, engine) print(df.head(10))
注意:如果密码包含@、:等特殊字符,需要进行URL转义。
内容的提问来源于stack exchange,提问作者JasonW
相关产品推荐
相关产品推荐

