如何通过nodejs exec将.sql文件导入到sqlite

Dar*_*ren 5 sqlite node.js

我在我的nodejs/express 应用程序中使用sqlite3 数据库。我想在启动 Express 服务器时将 .sql 文件导入到 sqlite 中。由于似乎没有办法使用 node-sqlite3 包导入,因此我尝试使用 exec 函数来执行此操作。

当我从命令行运行这两个命令时,它们都有效:

猫 db.sql | sqlite3 mydb.db sqlite3 mydb.db < db.sql

但是,当我尝试通过 nodejs exec 函数运行这些命令中的任何一个时,会创建 mydb.db 文件,但它是空的。这是我的代码:

var exec = require('child_process').exec;

child = exec('cat db.sql | sqlite3 mydb.db',
    function (error, stdout, stderr) {
        console.log('stdout: ' + stdout);
        console.log('stderr: ' + stderr);
        if (error !== null) {
            console.log('exec error: ' + error);
        }
);
Run Code Online (Sandbox Code Playgroud)

当我启动 Express 服务器时,我没有得到任何输出: Express 服务器正在监听 ip:localhost port:3000 stdout: stderr:

db文件已创建,但文件大小为0。当我用sqlite打开它时,mydb.db中没有表

我尝试了如上所示的两种方法,但都不起作用。我也尝试过使用spawn,但也没有取得任何成功。如何将 sql 文件导入到 nodejs 中的新数据库?

Lau*_*uri 1

Pipe|是一个用于链接命令的 shell 工具。在 Node 中,您需要分隔命令并将第一个输出重定向到下一个输入。

var fs = require("fs")
, spawn = require("child_process").spawn
, child = spawn("sqlite3", ["mydb.db"])

fs.createReadStream("./db.sql").pipe(child.stdin)
Run Code Online (Sandbox Code Playgroud)