Хранение SQLite в базе данных памяти с помощью ADM-ZIP (Node.js)
Я пытаюсь использовать sqlite3
модуль для создания в памяти базы данных SQLite и adm-zip
Модуль, чтобы сохранить его в ZIP-файл. До сих пор мне удавалось создать базу данных в памяти и добавлять в нее данные, но мне не удалось найти способ сохранить ее в архиве, созданном через adm-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"
}
}
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-файл в памяти и окончательный файл вывода в обратный вызов метода sqlite close.
db.close(function () {
zip.addFile('test.sqlite', fs.readFileSync(tempdb.path));
fs.writeFileSync('test.zip', zip.toBuffer(), 'utf8');
});