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

使用Python导出SQL Server表为CSV时遇语法错误求助

解决pyodbc导出SQL Server表到CSV的语法错误问题

问题说明

尝试用Python结合pandas与pyodbc,将SQL Server数据库AdventureWorksDW2019中的DatabaseLog、DimAccount表导出为CSV文件时,出现pyodbc.ProgrammingError,提示关键字'database'附近存在语法错误。

错误原因

原代码存在多个核心问题:

  • 循环执行SQL时写死了'SELECT * FROM database',这里的database是字符串字面量,SQL Server会将其视为无效对象名,触发语法错误;循环变量i未被实际调用。
  • 未获取查询结果,变量sql_query未定义,无法生成DataFrame。
  • 仅执行一次导出操作,无法分别导出两个表,固定文件名会导致数据覆盖。
  • 存在变量名大小写错误(print(I)中的大写I未定义)。

修正后的代码

import pandas as pd
import pyodbc

# 建立数据库连接
conn = pyodbc.connect(
    'Driver={SQL Server};'
    'Server=DESKTOP-0LA566U\SQLEXPRESS;'
    'Database=AdventureWorksDW2019;'
    'Trusted_Connection=yes;'
)

# 要导出的表列表
tables = ['DatabaseLog', 'DimAccount']
output_dir = r'C:\Users\cdtpr\OneDrive\Desktop\connections\\'

for table in tables:
    # 动态生成SQL查询语句,替换表名
    sql_query = f"SELECT * FROM {table}"
    # 用pandas直接读取查询结果到DataFrame
    df = pd.read_sql(sql_query, conn)
    # 导出为CSV,文件名用表名区分
    df.to_csv(f"{output_dir}{table}.csv", index=False)
    print(f"已导出表: {table}")

# 关闭数据库连接
conn.close()

关键修正点

  • 使用f-string动态生成SQL语句,将循环中的表名替换到查询语句中,避免写死字符串导致的语法错误。
  • 直接用pd.read_sql()读取查询结果,简化代码(无需手动用cursor获取结果)。
  • 每个表生成独立的CSV文件,文件名包含表名,防止文件覆盖。
  • 添加连接关闭操作,规范资源管理。

内容的提问来源于stack exchange,提问作者Krishna Menon Kaul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:21:28