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

使用Python自动创建Azure SQL DB列时to_sql报错的解决求助

解决Azure SQL DB导入多列CSV的Python自动建表问题

错误原因

你遇到的ArgumentError: Expected string or URL object, got <pyodbc.Connection object at ...>是因为SQLAlchemy的create_engine()函数需要传入连接字符串(或URL格式的对象),而非直接传入pyodbc的连接实例。

修正后的代码

以下是可以正常执行的代码,同时针对大量列的场景做了优化:

import pandas as pd
import urllib
from sqlalchemy import create_engine

# 读取CSV文件
fpath = r"C:\Users\***\test.csv"
df = pd.read_csv(fpath)

# 构造SQLAlchemy兼容的Azure SQL DB连接字符串
params = urllib.parse.quote_plus(
    "DRIVER={ODBC Driver 17 for SQL Server};"
    "Server=tcp:XXX.database.windows.net,1433;"
    "DATABASE=XXX;"
    "UID=XXX;"
    "PWD=XXX;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
    "Connection Timeout=30;"
)
connection_url = f"mssql+pyodbc:///?odbc_connect={params}"

# 创建SQLAlchemy引擎
engine = create_engine(connection_url)

# 将数据写入Azure SQL DB,自动创建表结构
df.to_sql(
    name='test',
    con=engine,
    if_exists='replace',  # 可选值:replace(重建表)/append(追加数据)/fail(表存在则报错)
    index=False,
    method='multi'  # 批量插入模式,适合大量列/数据的场景,提升效率
)

关键注意事项

  1. 列数限制问题:SQL Server(包括Azure SQL DB)单表最多仅支持1024列,你的CSV有3300列,远超这个限制,无法直接创建对应表。需要先对数据进行预处理:
    • 将数据拆分为多个表,按列分组存储
    • 转换为键值对(EAV)结构存储,把列名作为属性字段,对应值作为内容字段
  2. 列名规范:确保CSV中的列名符合SQL Server的标识符规则,避免包含特殊字符、空格或SQL关键字,否则会导致建表失败。

内容的提问来源于stack exchange,提问作者WhoamI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:56:04