我正在尝试使用sqlite3
模块创建内存中的SQLite数据库,并使用adm-zip
模块将其保存到zip文件中。到目前为止,我已经能够创建一个内存数据库并向其中添加数据,但是我找不到将它存储在通过adm-zip
创建的zip中的方法,因为它需要文件,缓冲区或字符串
我的问题是:sqlite3
模块是否支持存储或保存为缓冲区?如果没有那么当脚本被用作可被请求的模块和命令行脚本时,什么是在Node.js中存储临时文件的可行解决方案?
我已经包含了我用来测试下面的代码和可克隆的要点。
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"
}
}
答案 0 :(得分:1)
在继续寻求这个问题的答案的同时,我偶然发现了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');
});
我包含了临时模块,并确保激活使用.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');
});