如何在VSCode插件代码中访问SQLite数据库文件?
读取SQLite缓冲区并转换为JSON的实现方案(针对VSCode插件)
一、使用SQL.js实现
SQL.js支持直接从ArrayBuffer加载SQLite数据库,适配VSCode插件的Electron环境。核心逻辑是读取本地文件为ArrayBuffer,初始化数据库实例后执行查询,再将结果映射为JSON格式。
import * as vscode from 'vscode'; import initSqlJs from 'sql.js'; async function sqliteBufferToJson(sqliteFilePath: string, query: string = "SELECT * FROM your_table") { // 读取本地SQLite文件为ArrayBuffer(VSCode官方推荐使用workspace.fs API) const fileBuffer = await vscode.workspace.fs.readFile(vscode.Uri.file(sqliteFilePath)); const arrayBuffer = fileBuffer.buffer.slice(fileBuffer.byteOffset, fileBuffer.byteOffset + fileBuffer.byteLength); // 初始化SQL.js实例 const SQL = await initSqlJs({ locateFile: file => `./node_modules/sql.js/dist/${file}` // 优先使用本地打包的wasm文件 }); // 加载数据库并执行查询 const db = new SQL.Database(new Uint8Array(arrayBuffer)); const result = db.exec(query); // 将查询结果转换为JSON数组 if (result.length === 0) return []; const columns = result[0].columns; return result[0].values.map(row => { const rowObj: Record<string, any> = {}; columns.forEach((col, idx) => { rowObj[col] = row[idx]; }); return rowObj; }); }
注意:需在插件package.json中添加sql.js依赖,并确保wasm文件被正确打包到插件目录,避免依赖外部CDN。
二、使用sqlite3实现
sqlite3是Node.js原生SQLite模块,VSCode插件基于Electron可直接调用。如果已有文件缓冲区,可通过内存数据库加载后查询,结果本身就是JSON格式的对象数组。
import * as vscode from 'vscode'; import sqlite3 from 'sqlite3'; import { promisify } from 'util'; // 从本地文件读取并转JSON async function sqliteFileToJson(sqliteFilePath: string, query: string = "SELECT * FROM your_table") { const db = new sqlite3.Database(sqliteFilePath); const allAsync = promisify(db.all.bind(db)); try { // 执行查询,返回的rows直接是JSON对象数组 return await allAsync(query); } finally { db.close(); } } // 从已有Buffer加载并转JSON async function sqliteBufferToJsonWithSqlite3(buffer: Buffer, query: string = "SELECT * FROM your_table") { const db = new sqlite3.Database(':memory:'); const runAsync = promisify(db.run.bind(db)); const allAsync = promisify(db.all.bind(db)); try { // 将缓冲区附加为临时数据库 await runAsync("ATTACH DATABASE ? AS temp_db", [buffer]); // 查询临时数据库中的表 const rows = await allAsync(query.replace(/your_table/g, 'temp_db.your_table')); return rows; } finally { db.close(); } }
注意:安装sqlite3时需适配Electron环境,执行npm install sqlite3 --build-from-source --runtime=electron --target=你的Electron版本避免兼容问题。
内容的提问来源于stack exchange,提问作者Naveen Pandurangi
相关产品推荐
相关产品推荐

