如何高效将Pandas DataFrame插入带序列的DuckDB表?
解决DuckDB批量插入Pandas DataFrame列数不匹配问题
问题根源很明确:temp表包含id、name、age三列,但你的Pandas DataFrame只有Name和Age两列,缺少依赖serial序列生成的id列,导致插入时列数不匹配。以下是两种高效批量插入的解决方案,均无需逐条迭代:
方案1:插入时直接调用序列生成id(推荐)
无需修改DataFrame,直接在INSERT的SELECT语句中加入nextval('serial')生成id列,与DataFrame的两列组合后刚好匹配表结构:
con.execute("INSERT INTO temp SELECT nextval('serial'), Name, Age FROM df")
数据库会自动为每一行数据生成唯一递增的id,全程批量处理,效率最高且无需额外维护序列状态。
方案2:先给DataFrame添加id列再插入
如果需要在Python端处理id生成,可以先基于数据库序列生成对应id值(需注意同步序列状态避免冲突),再执行插入:
# 获取序列当前值,生成对应数量的id current_val = con.execute("SELECT currval('serial')").fetchone()[0] df['id'] = range(current_val + 1, current_val + 1 + len(df)) # 更新序列当前值,避免后续插入冲突 con.execute(f"SELECT setval('serial', {current_val + len(df)})") # 批量插入数据 con.execute("INSERT INTO temp SELECT id, Name, Age FROM df")
这种方法需要手动维护序列状态,不如方案1简洁可靠,仅在特殊场景下使用。
替代Pandas的批量导入方式
如果不想使用Pandas,也可以直接用DuckDB支持的文件格式(如CSV、Parquet)批量导入,同样结合序列生成id:
-- 假设数据存储在data.csv,列结构为Name,Age INSERT INTO temp SELECT nextval('serial'), Name, Age FROM read_csv('data.csv');
内容的提问来源于stack exchange,提问作者Dmitry Petrov
相关产品推荐
相关产品推荐

