2014-10-11 3 views
1

Я пытаюсь использовать модуль sqlite3 для создания базы данных SQLite в памяти и модуля adm-zip, чтобы сохранить его в zip-файле. До сих пор мне удалось создать базу данных в памяти и добавить к ней данные, но мне не удалось найти способ сохранить ее в zip-файле, сделанном через adm-zip, поскольку для этого требуется либо файл, буфер или строка.Хранение SQLite в базе данных памяти с ADM-ZIP (Node.js)

Мой вопрос в том, поддерживает ли модуль 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

Продолжая проводить ответ на этот вопрос, я наткнулся на модуль НПМ 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 файл в в почтовый памяти и окончательный выход почтовый файл в sqlite закрыть метод обратного вызова.

db.close(function() { 

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

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

}); 

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

+0

Большой upvote здесь. Это было действительно полезно. – Lolums

Смежные вопросы