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

如何在DuckDB中正确传入DataFrame作为参数?

问题解决:DuckDB传入DataFrame时的解析错误

错误原因

直接用字符串格式化%s把DataFrame插入SQL语句,会将DataFrame转为带索引、换行的表格字符串,完全不符合SQL语法规范,导致解析报错。

正确解决方案

方案1:使用DuckDB参数绑定(推荐)

用?作为占位符,将DataFrame作为参数传入duckdb.sql(),这是DuckDB官方推荐的安全参数传递方式:

import pandas as pd
import duckdb

df=pd.DataFrame({'var1':['S1','S2'],'var2':['aba','saa',],'var3':['ia','ma'],'var4':[42,21]})

duckdb.sql('''
    drop table if exists dat;

    create table dat as
    select *
    from ?
    where var1='S1'
''', df)

# 验证结果
print(duckdb.sql('select * from dat').df())

方案2:注册临时视图后引用

先把DataFrame注册为DuckDB的临时视图,再在SQL中直接引用视图名称:

import pandas as pd
import duckdb

df=pd.DataFrame({'var1':['S1','S2'],'var2':['aba','saa',],'var3':['ia','ma'],'var4':[42,21]})

# 注册临时视图
duckdb.register('df_temp', df)

duckdb.sql('''
    drop table if exists dat;

    create table dat as
    select *
    from df_temp
    where var1='S1'
''')

# 验证结果
print(duckdb.sql('select * from dat').df())

注意事项

  • 禁止使用字符串格式化传递DataFrame,除了语法错误外,还会带来SQL注入风险。
  • 两种方案执行后,dat表都会只保留var1='S1'的行:
    var1 var2 var3  var4
    0   S1  aba   ia    42
    

内容的提问来源于stack exchange,提问作者bagelanta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:20:55