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

