使用ADM-ZIP(Node.js)将SQLite存储在内存数据库中

3
我正在尝试使用sqlite3模块创建内存SQLite数据库,并使用adm-zip模块将其保存到zip文件中。到目前为止,我已经能够创建内存数据库并向其中添加数据,但我没有找到一种方法可以将其存储在通过adm-zip创建的zip文件中,因为该模块要求使用文件、缓冲区或字符串。
我的问题是:是否sqlite3模块支持存储或保存为缓冲区?如果不支持,那么当脚本既用作可require的模块又用作命令行脚本时,在Node.js中存储临时文件的建议解决方案是什么?
下面是我用于测试的代码和可克隆的gist。 main.js
var fs = require('fs'),
    admzip = require('adm-zip'),
    sqlite3 = require('sqlite3').verbose(),
    zip = new admzip(),
    db = new sqlite3.Database('test.sqlite');
    // db = new sqlite3.Database(':memory:');

db.serialize(function() {

    db.run('CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY, name TEXT);');
    db.run('INSERT OR IGNORE INTO test(name) VALUES ("neogeek");');

});

zip.addFile('README.md', '#SQLite3 + ADM-ZIP Test');

// zip.addFile('db.sqlite', db);

db.close();

fs.writeFileSync('test.zip', zip.toBuffer(), 'utf8');

package.json

{
    "private": true,
    "dependencies": {
        "sqlite3": "3.0.2",
        "adm-zip": "0.4.4"
    }
}

https://gist.github.com/neogeek/70c80c7ddaf998bee4bd

1个回答

2

在继续寻找答案的过程中,我偶然发现了npm模块temp,并成功地根据以下详细说明拼凑出了可行的解决方案。

var fs = require('fs'),
    temp = require('temp').track(),
    admzip = require('adm-zip'),
    sqlite3 = require('sqlite3').verbose(),
    zip = new admzip(),
    tempdb = temp.openSync('db.sqlite'),
    db = new sqlite3.Database(tempdb.path);

db.serialize(function() {

    db.run('CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY, name TEXT);');
    db.run('INSERT OR IGNORE INTO test(name) VALUES ("neogeek");');

});

zip.addFile('README.md', '#SQLite3 + ADM-ZIP Test');

db.close(function () {

    zip.addFile('test.sqlite', fs.readFileSync(tempdb.path));

    fs.writeFileSync('test.zip', zip.toBuffer(), 'utf8');

});

我包含了temp模块,并确保激活使用.track()创建的任何临时文件的自动清理。

temp = require('temp').track(),

我随后创建了一个新文件来存储sqlite数据库。
tempdb = temp.openSync('db.sqlite'),

最终,我把将SQLite文件写入内存zip和最终输出zip文件的操作移动到了SQLite close方法的回调函数中。

db.close(function () {

    zip.addFile('test.sqlite', fs.readFileSync(tempdb.path));

    fs.writeFileSync('test.zip', zip.toBuffer(), 'utf8');

});

https://gist.github.com/neogeek/70c80c7ddaf998bee4bd


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接