如何在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
相关产品推荐
相关产品推荐

