DuckDB参数绑定失效求助:使用$input_file报错找不到文件
问题分析与解决
问题根源
你遇到的错误是因为参数占位符被当成了字面量文件名。DuckDB的参数绑定机制中,$input_file这类占位符不能被包裹在单引号里——一旦加了引号,DuckDB就会把$input_file当作实际的文件名去查找,而不是解析为你传入的参数值,自然会提示找不到匹配的文件。
解决方案
去掉$input_file外面的单引号,让DuckDB识别这是一个参数占位符,而非字面量字符串。参数绑定的占位符不需要额外的引号包裹,DuckDB会自动根据你传入的参数类型处理转换。
修正后的可运行代码
import json import duckdb # 假设input_file是你的JSON文件路径 input_file = "path/to/your/logs.json" con = duckdb.connect() con.execute( "CREATE TABLE log_data AS SELECT * FROM read_json($input_file, " "json_format='auto'," "auto_detect=false," f"columns={json.dumps({'id': 'varchar', '@timestamp': 'varchar', '@version': 'varchar', 'message': 'varchar'})})", {'input_file': input_file}, )
额外说明
如果需要更严格的SQL注入防护,也可以使用?作为匿名占位符,对应的参数传入列表即可:
con.execute( "CREATE TABLE log_data AS SELECT * FROM read_json(?, " "json_format='auto'," "auto_detect=false," f"columns={json.dumps({'id': 'varchar', '@timestamp': 'varchar', '@version': 'varchar', 'message': 'varchar'})})", [input_file], )
内容的提问来源于stack exchange,提问作者aronchick
相关产品推荐
相关产品推荐

