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

如何通过DuckDB C语言API动态传递CSV文件路径至SQL语句

动态传递CSV路径到DuckDB C/C++ API的可行方案

完全可以实现动态传递文件路径,你之前的问题出在混淆了DuckDB SQL变量和C/C++代码变量的边界,下面给你两种实用的实现方法:

方法1:构造包含路径的SQL字符串(简单直接)

DuckDB执行的SQL是纯字符串,你需要把C++的fileName变量值拼接到SQL语句里,注意要给路径加单引号(因为read_csv的第一个参数要求是字符串类型):

std::string sql = "SELECT * FROM read_csv('" + fileName + "', sample_size = -1);";
duckdb_query(CSVDuckDBConnection, sql.c_str(), &CSVDuckDBResult);

注意:如果路径里包含单引号(比如O'Neil.csv),这种方法会报错,需要先对单引号做转义(把'替换成'')。

方法2:使用参数化查询(更安全,推荐)

用DuckDB的预处理语句和参数绑定功能,既能避免SQL注入风险,也不用手动处理字符串转义:

// 1. 预处理SQL语句,用?作为参数占位符
duckdb_prepared_statement stmt;
duckdb_prepare(CSVDuckDBConnection, "SELECT * FROM read_csv(?, sample_size = -1);", &stmt);

// 2. 绑定参数:把fileName绑定到第一个占位符(索引从0开始)
duckdb_bind_varchar(stmt, 0, fileName.c_str());

// 3. 执行预处理语句
duckdb_execute_prepared(stmt, &CSVDuckDBResult);

// 4. 记得释放预处理语句资源
duckdb_destroy_prepared_statement(&stmt);

你之前方法失败的原因

  • 直接在SQL里写fileName:DuckDB会把它当成SQL标识符(比如表名/列名),而非读取你C++代码里的变量值,自然找不到对应文件。
  • 使用getvariable的错误:getvariable('fn')是DuckDB SQL语法内的函数,不能在C代码里直接调用;而且你执行SET VARIABLE fn = fileName;时,DuckDB同样会把fileName当成SQL标识符,而非C变量,本质还是没把实际路径传递进去。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:16:01