DuckDB-Wasm调用insertArrowTable后查询表提示不存在的问题排查
解决DuckDB-Wasm查询Arrow表提示“表不存在”的问题
你遇到的问题根源在于insertArrowTable方法的作用是向已存在的数据库表插入数据,而非创建新表或注册可直接查询的Arrow表。你跳过了创建表或注册临时表的步骤,导致查询时数据库找不到对应的表。
方案一:使用registerArrowTable注册临时表(推荐)
registerArrowTable会直接将Arrow表注册为数据库的临时表,无需提前创建表,注册后即可直接查询:
const dlURL="http://localhost:7071/api/getdata" const arrowTable = await tableFromIPC(fetch(dlURL)) const c = await db.connect(); // 注册Arrow表为可查询的临时表 await c.registerArrowTable(arrowTable, { name: 'arrowTable' }) let qres = await c.query("select * from arrowTable")
方案二:先创建表再插入数据
如果需要将数据持久化到数据库表中,需先根据Arrow表的结构创建对应表,再执行插入操作:
const dlURL="http://localhost:7071/api/getdata" const arrowTable = await tableFromIPC(fetch(dlURL)) const c = await db.connect(); // 根据Arrow表结构生成建表SQL const schema = arrowTable.schema; const fields = schema.fields.map(field => { // 映射Arrow数据类型到DuckDB兼容类型,可根据实际字段类型扩展 const duckDbType = { [ArrowType.Int]: 'INTEGER', [ArrowType.Float]: 'FLOAT', [ArrowType.String]: 'VARCHAR', [ArrowType.Bool]: 'BOOLEAN', [ArrowType.Date]: 'DATE' }[field.type.typeId] || 'VARCHAR'; return `${field.name} ${duckDbType}`; }).join(', '); await c.query(`CREATE TABLE arrowTable (${fields})`); // 向已创建的表插入Arrow数据 await c.insertArrowTable(arrowTable, { name: 'arrowTable' }) let qres = await c.query("select * from arrowTable")
两种方案的区别
registerArrowTable:注册的是临时表,仅在当前数据库会话有效,会话关闭后表会被销毁,适合临时查询场景。- 建表+插入:创建的是持久化表(若使用文件型数据库则会保留,内存型数据库重启后仍会丢失),适合需要长期存储数据的场景。
内容的提问来源于stack exchange,提问作者Dean MacGregor
相关产品推荐
相关产品推荐

