У меня есть этот 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()