Импорт из MySQL в ArangoDB постоянно неполный (собственный скрипт Node.js)

Я написал наивный сценарий 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.


person CodeManX    schedule 04.11.2014    source источник


Ответы (2)


В вашей функции строки процесса есть небольшая ошибка. Вы запускаете его с одной строкой за один шаг и помещаете все строки в массив документов. При выполнении этого для строки 1000 документы записываются в ArangoDB, и вы вставляете следующую строку. И вот ошибка, 1000-я строка не хранится в документах ни разу. Одно возможное исправление:

        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 = [row]; // Insert row here
            connection.resume();
            if (row === false) process.exit();
        }
    );
person mchacki    schedule 04.11.2014

В processRow() вы ничего не делаете с row в ветке else, когда row не false.

Так что вам может потребоваться изменить:

function(err, ret) {
  docs = [];
  connection.resume();
  if (row === false) process.exit();
}

примерно так:

function(err, ret) {
  if (row)
    docs = [row];
  else
    docs = [];
  connection.resume();
  if (row === false) process.exit();
}
person mscdex    schedule 04.11.2014
comment
Спасибо, это было очевидно и трудно заметить одновременно! - person CodeManX; 05.11.2014