Хранение 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"
    }
}

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

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');

});

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

Другие вопросы по тегам