gpt4 book ai didi

javascript - 从 MySQL 导入 ArangoDB 始终不完整(自己的 Node.js 脚本)

转载 作者:搜寻专家 更新时间:2023-11-01 00:18:12 25 4
gpt4 key购买 nike

我写了一个简单的 Node.js 脚本来将 MySQL 表迁移到 ArangoDB收藏。

它工作得很好,尽管总是丢失记录,好像连接关闭得太早了。丢失多少文档不是随机的,但是总是相同的数量:

  • 源中有68,750条记录,

  • 我的自建缓冲区大小为1000,

  • 在 ArangoDB 中创建了 68,682 (-68) 个文档

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);
});

Another version of the script我写的是使用转换流并导入恰好 68,744 条记录,并且 a third script所有记录,但在完成时创建目标集合和记录,尽管它应该写入每个 n 个源记录。

我在这里明显遗漏了什么吗?

一个计数器变量可以确认所有 68,750 条记录都被读取并且没有源记录是完全空的(所有列 NULL),因为至少有一个主键整数(我也试过没有定制的 JSON stringify 处理程序)。


解决方法:

当缓冲区已满时,对每 nth 行做一些事情,感谢 mscdex 和 mchacki 发现了这个明显的错误!

固定 stream_array_join.js

最佳答案

您的流程行函数中存在轻微错误。您一步触发一行并将所有行插入 docs 数组。当为第 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();
}
);

关于javascript - 从 MySQL 导入 ArangoDB 始终不完整(自己的 Node.js 脚本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26742822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com