如何使用psycopg2按int8格式特定ID批量保存文件?
问题分析与解决方案
你的代码存在几个关键问题,直接导致无法正常运行,以下是修正方案:
核心问题点
- DataFrame迭代方式错误:直接用
log_id[0]无法正确遍历列数据,需明确指定列名或用位置索引定位 - 查询结果未正确转换:
cur.execute()返回的是游标对象,不是DataFrame,不能直接调用to_excel() - 文件名拼接类型不兼容:
item是int8类型,直接和字符串拼接会触发类型错误 - 数据库占位符错误:多数数据库不支持
??作为参数占位符,需根据数据库类型调整(比如SQLite用?,MySQL/PostgreSQL用%s)
修正后的代码(推荐用pandas直接查询)
import pandas as pd # 假设log_id是包含file_id列的DataFrame for item in log_id['file_id']: # 或用log_id.iloc[:, 0]定位第一列 # 根据你的数据库类型调整占位符,比如MySQL替换为%s query = 'SELECT * FROM "entries" WHERE "entries"."file_id" = ?;' # 用pd.read_sql直接获取查询结果为DataFrame result_df = pd.read_sql(query, con=你的数据库连接对象, params=[item]) # 将int8类型的item转为字符串后拼接文件名 writer = pd.ExcelWriter(f'log{str(item)}.xlsx', engine='xlsxwriter') result_df.to_excel(writer, index=False) writer.close() # 新版本xlsxwriter推荐用close替代save
若坚持使用游标方式的修正版
for item in log_id['file_id']: query = 'SELECT * FROM "entries" WHERE "entries"."file_id" = ?;' cur.execute(query, [item]) # 从游标中提取列名和数据,转换为DataFrame column_names = [col[0] for col in cur.description] result_df = pd.DataFrame(cur.fetchall(), columns=column_names) # 处理文件名拼接 writer = pd.ExcelWriter(f'log{str(item)}.xlsx', engine='xlsxwriter') result_df.to_excel(writer, index=False) writer.close()
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

