SQLite - операторы nodejs не сбрасываются до завершения программы - PullRequest
0 голосов
/ 20 мая 2019

У меня есть этот sqlite-код, который обрабатывает кучу записей:

let sqlite = require('sqlite3');

let dbfile = '/tmp/notes.sqlite.db'
let db = new sqlite.Database(dbfile);

db.run('CREATE TABLE if not exists mytable (UniversalId TEXT)');
fileList = ['a', 'b', 'c', 'd']
fileList.forEach((docFilename, count) => {
    db.serialize(() => {
            console.log("Doing")
            db.run("Begin transaction");
            var sql = `INSERT INTO mytable (UniversalId) values (?)`
            db.prepare(sql).run([docFilename], function (err) {
                if (err) console.error(`ERROR ${err} for uid ${universalId} ${sql}`)
                console.log("Statement run")
            }).finalize()
        db.run("commit transaction");
})
})
console.log("Closing")
db.close()

Операторы не выполняются, когда я фиксирую транзакции, но только после того, как я закрываю БД и готовлюсь к выходу из программы. Вот вывод

> node index.js 
Doing
Doing
Doing
Doing
Closing
Statement run
Statement run
Statement run
Statement run

Моя проблема в том, что, если я выполняю достаточно работы в цикле forEach, у меня заканчивается память. Как заставить SQLite выполнять / фиксировать каждый оператор на границах транзакции, которые я здесь явно использую?

Я пробовал с async lib, как предлагает другой ответ SO, и получаю те же результаты:

let sqlite = require('sqlite3').verbose();
var async= require('async');

let dbfile = '/tmp/notes.sqlite.db'
let db = new sqlite.Database(dbfile);

db.run('CREATE TABLE if not exists mytable (UniversalId TEXT)');
fileList = ['a', 'b', 'c', 'd']
async.each(fileList,function(docFilename) {
            console.log("Doing")
            var sql = `INSERT INTO mytable (UniversalId) values (?)`
            db.prepare(sql).run([docFilename], function (err) {
                if (err) console.error(`ERROR ${err} for uid ${universalId} ${sql}`)
                console.log("Statement run")
            }).finalize()
})
console.log("Closing")
db.close()
...