使用Node.js将SQLite数据库导入MySQL的问题求助
解决ShellJS执行SQLite命令卡住的问题
这个问题我之前也碰到过!原因是你每次调用shell.exec()都是启动一个全新的进程,第一个sqlite3命令启动后进入了交互模式,程序会卡在那里等待用户输入,而后面的命令其实都是在独立的进程里执行,根本没进入同一个SQLite会话,自然不会生效。
下面给你几种可行的解决办法:
方法1:使用Shell Here-Document一次性传入所有命令
把所有SQLite命令打包成一个完整的Shell命令,通过Here-Document(EOF标记)一次性传给sqlite3,这样所有命令都会在同一个交互会话中执行:
const shell = require('shelljs'); // 合并所有SQLite命令为一个Shell命令 shell.exec(`sqlite3 /path/to/sqlite-db.db << 'EOF' .headers on .mode csv .output /path/to/data.csv select * from Table; .quit EOF`);
这种方式和你在终端手动输入的流程完全一致,sqlite3会依次执行EOF之间的所有命令,执行完成后自动退出,不会卡住。
方法2:通过ShellJS的input参数传递命令
利用shell.exec()的input选项,把所有SQLite命令作为标准输入传给sqlite3进程,这种写法更简洁:
const shell = require('shelljs'); // 按换行分隔所有SQLite命令 const sqliteCommands = `.headers on .mode csv .output /path/to/data.csv select * from Table; .quit`; // 执行sqlite3并传入命令 shell.exec('sqlite3 /path/to/sqlite-db.db', { input: sqliteCommands });
input参数会把指定的字符串作为进程的标准输入,sqlite3读取到这些命令后会依次执行,执行完毕后自动退出。
方法3:直接使用Node.js的SQLite库(推荐)
如果你的项目是基于Node.js的,更推荐直接使用sqlite3库操作数据库,不需要依赖Shell调用,这样更高效、更可控,也避免了Shell进程的问题:
首先安装依赖:
npm install sqlite3
然后编写代码:
const sqlite3 = require('sqlite3').verbose(); const fs = require('fs'); // 连接数据库 const db = new sqlite3.Database('/path/to/sqlite-db.db'); // 查询所有数据 db.all('SELECT * FROM Table', (err, rows) => { if (err) { console.error('查询失败:', err); return; } if (rows.length === 0) { console.log('表中没有数据'); db.close(); return; } // 生成CSV内容 const headers = Object.keys(rows[0]); // 处理每行数据,给字符串类型字段加引号避免CSV格式问题 const csvRows = [ headers.join(','), ...rows.map(row => headers.map(header => `"${row[header]}"`).join(',')) ]; const csvContent = csvRows.join('\n'); // 写入CSV文件 fs.writeFileSync('/path/to/data.csv', csvContent); console.log('CSV文件生成成功'); db.close(); });
这种方法不需要调用外部Shell进程,直接在Node.js环境中完成数据库查询和CSV生成,出错时也更容易调试。
内容的提问来源于stack exchange,提问作者Awais Ayub
相关产品推荐
相关产品推荐

