使用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
相关产品推荐
相关产品推荐

