我尝试过以下代码:
con = DBInterface.connect(DuckDB.DB)
query = "SELECT * FROM range(1000000000000) t(i)"
res = DBInterface.execute(con, query, DuckDB.StreamResult)
# fetch the first three chunks
for i in 1:3
chunk = DuckDB.nextDataChunk(res)
DuckDB.destroy_data_chunk(chunk)
end
DBInterface.close!(res)
DBInterface.close!(con)
GC.gc(true)
但它并不是真正的分块阅读。相反,它尝试读取单个结果中的整个
1000000000000
行并炸毁我的 RAM。 不过,我从测试中得到了这段代码。
我错过了什么吗?
可以使用 MaterializedResult 或 StreamResult 来创建
Stmt
对象
function execute(con::Connection, sql::AbstractString, params::DBInterface.StatementParams)
stmt = Stmt(con, sql, MaterializedResult)
try
return execute(stmt, params)
finally
_close_stmt(stmt) # immediately close, don't wait for GC
end
end
这似乎总是创建一个 MaterializedResult您可以将其分解并用 StreamResult 替换 MaterializedResult ,它应该可以工作。