Я написал наивный сценарий Node.js для переноса таблицы MySQL в коллекцию ArangoDB.
Он работает достаточно хорошо, несмотря на то, что всегда отсутствуют записи, как будто соединение было закрыто слишком рано. Количество пропавших без вести документов не случайно, однако это всегда одно и то же количество:
В источнике 68750 записей,
мой самодельный буфер имеет размер 1000 и
68 682 (-68) документов создано в ArangoDB
var mysql = require('mysql');
var arango = require('arango');
var docs = [];
function processRow(row, connection) {
if (docs.length < 1000 && row !== false) {
docs.push(row);
} else {
connection.pause();
db.import.importJSONData(
"target_collection",
JSON.stringify(docs, function(key, value) {
if (value == null || (typeof value === "string" && !value.trim())) {
return undefined;
} else {
return value;
}
}),
{
createCollection: true,
waitForSync: false
},
function(err, ret) {
docs = [];
connection.resume();
if (row === false) process.exit();
}
);
}
}
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: ''
});
var db = arango.Connection("http://localhost:8529/my_database");
connection.connect();
var query = connection.query('SELECT * FROM my_database.source_table');
var i = 0;
query
.on('error', function(err) {
console.log(err);
})
.on('result', function(row) {
i++;
if (i % 1000 == 0) console.log(i);
processRow(row, connection);
})
.on('end', function() {
processRow(false, connection);
});
Другая версия написанного мной скрипта использует поток преобразования и импорт ровно 68 744 записей и третий сценарий все записи, кроме создает целевую коллекцию и записывает по мере ее завершения, хотя он должен записывать каждые n исходных записей.
Есть ли что-то очевидное, что мне здесь не хватает?
Переменная счетчика может подтвердить, что все 68 750 записей прочитаны и нет исходных записей, которые были бы полностью пустыми (все столбцы NULL
), поскольку есть по крайней мере целое число первичного ключа (и я также пробовал без настраиваемого обработчика JSON stringify).
Решение:
Сделайте что-нибудь с каждой n-й строкой, когда буфер заполнен, за обнаружение этой очевидной ошибки заслуги передаются mscdex и mchacki!
Исправлен stream_array_join.js.