如何批量导出AdventureWorks2019数据库所有表为同名CSV文件
问题描述
以下代码用于从数据库中单次导出一张表为CSV格式:
import pandas as pd import pyodbc conn = pyodbc.connect('Driver={SQL Server};' 'Server=DESKTOP-0LA566U\SQLEXPRESS;' 'Database=AdventureWorksDW2019;' 'Trusted_Connection=yes;') sql_query = pd.read_sql_query(''' select * from DimAccount''' ,conn) df = pd.DataFrame(sql_query) df.to_csv (r'C:\Users\cdtpr\OneDrive\Desktop\connections\DimAccount.csv', index = False)
如上代码仅支持单次导出一张表为CSV格式,例如示例中导出了DimAccount表。目前只能逐个导出表,想一次性将AdventureWorksDW2019数据库中的30张表全部以表名命名导出为CSV格式,求实现方法。
实现方法
要批量导出所有用户表,核心逻辑是先获取数据库中所有用户自定义表的名称,再循环遍历每个表执行导出操作。以下是完整可运行的代码:
import pandas as pd import pyodbc import os # 数据库连接配置 conn_params = { 'Driver': '{SQL Server}', 'Server': 'DESKTOP-0LA566U\\SQLEXPRESS', 'Database': 'AdventureWorksDW2019', 'Trusted_Connection': 'yes' } # CSV导出目录(自动创建不存在的目录) output_dir = r'C:\Users\cdtpr\OneDrive\Desktop\connections\\' os.makedirs(output_dir, exist_ok=True) # 建立数据库连接 conn = pyodbc.connect(**conn_params) cursor = conn.cursor() # 查询当前数据库下所有用户表的完整名称(含架构) cursor.execute(""" SELECT CONCAT(s.name, '.', t.name) AS full_table_name FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.type = 'U' -- 仅筛选用户表,排除系统表 """) # 提取所有表名 tables = [row.full_table_name for row in cursor.fetchall()] # 循环导出每个表为CSV for table in tables: # 读取表数据 df = pd.read_sql_query(f"SELECT * FROM {table}", conn) # 处理文件名:将架构与表名的分隔符替换为下划线,避免路径非法字符 csv_name = f"{table.replace('.', '_')}.csv" # 导出CSV df.to_csv(os.path.join(output_dir, csv_name), index=False, encoding='utf-8-sig') print(f"完成导出: {table} -> {csv_name}") # 关闭数据库连接 cursor.close() conn.close()
关键细节说明
- 获取表名:通过查询
sys.tables和sys.schemas系统视图,精准筛选用户创建的表(t.type = 'U'),避免导出系统表;若不需要架构前缀,直接取t.name即可。 - 目录自动创建:使用
os.makedirs(output_dir, exist_ok=True)确保导出目录存在,无需手动创建。 - 编码与乱码:指定
encoding='utf-8-sig'导出,解决Excel打开CSV时的中文乱码问题。 - 文件名处理:将表名中的
.(架构分隔符)替换为_,避免生成非法文件名。
内容的提问来源于stack exchange,提问作者Krishna Menon Kaul
相关产品推荐
相关产品推荐

