nodeJS 将数据插入 PostgreSQL 错误
nodeJS inserting Data into PostgreSQL error
我在使用 NodeJS 和 PostgreSQL 时遇到一个奇怪的错误,我希望你能帮我解决。
我有大量的数据集,大约有 200 万条条目要插入到我的数据库中。
一个数据包含4列:
id: string,
points: float[][]
mid: float[]
occurences: json[]
我是这样插入数据的:
let pgp = require('pg-promise')(options);
let connectionString = 'postgres://archiv:archiv@localhost:5432/fotoarchivDB';
let db = pgp(connectionString);
cityNet.forEach((arr) => {
db
.none(
"INSERT INTO currentcitynet(id,points,mid,occurences) VALUES ",
Inserts("${id},${points}::double precision[],${mid}::double precision[],${occurences}::json[]",arr))
.then(data => {
//success
})
.catch(error => {
console.log(error);
//error
});
})
function Inserts(template, data) {
if (!(this instanceof Inserts)) {
return new Inserts(template, data);
}
this._rawDBType = true;
this.formatDBType = function() {
return data.map(d => "(" + pgp.as.format(template, d) + ")").join(",");
};
这正好适用于前 309248 个数据片段,然后突然它只是错误地出现以下(看起来像)它试图插入的每个下一个数据:
{ error: syntax error at end of input
at Connection.parseE (/home/christian/Masterarbeit_reworked/projekt/server/node_modules/pg-promise/node_modules/pg/lib/connection.js:539:11)
at Connection.parseMessage (/home/christian/Masterarbeit_reworked/projekt/server/node_modules/pg-promise/node_modules/pg/lib/connection.js:366:17)
at Socket.<anonymous> (/home/christian/Masterarbeit_reworked/projekt/server/node_modules/pg-promise/node_modules/pg/lib/connection.js:105:22)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:548:20)
name: 'error',
length: 88,
severity: 'ERROR',
code: '42601',
detail: undefined,
hint: undefined,
position: '326824',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'scan.l',
line: '1074',
routine: 'scanner_yyerror' }
'position' 条目随着每个迭代错误消息而改变。
我可以重做,它总是在 309248 个条目后出错。
当我尝试插入更少的条目时,例如 1000 个条目,错误不会发生。
这让我很困惑。我认为 PostgreSQL 没有任何最大行数。此外,错误消息对我没有任何帮助。
已解决
发现错误。在我的数据中,有 "null" 个条目滑入其中。过滤掉空数据。
我将尝试其他插入数据的建议,因为当前的方式有效,但性能非常糟糕。
我不确定,但看起来你在最后一个元素 (309249) 的数据结构有误,而且 PostgreSQL 无法解析某些 属性
我是 pg-promise 的作者。您的整个方法应更改为以下方法。
通过pg-promise进行大量插入的正确方法:
const pgp = require('pg-promise')({
capSQL: true
});
const db = pgp(/*connection details*/);
var cs = new pgp.helpers.ColumnSet([
'id',
{name: 'points', cast: 'double precision[]'},
{name: 'mid', cast: 'double precision[]'},
{name: 'occurences', cast: 'json[]'}
], {table: 'currentcitynet'});
function getNextInsertBatch(index) {
// retrieves the next data batch, according to the index, and returns it
// as an array of objects. A normal batch size: 1000 - 10,000 objects,
// depending on the size of the objects.
//
// returns null when there is no more data left.
}
db.tx('massive-insert', t => {
return t.sequence(index => {
const data = getNextInsertBatch(index);
if (data) {
const inserts = pgp.helpers.insert(data, cs);
return t.none(inserts);
}
});
})
.then(data => {
console.log('Total batches:', data.total, ', Duration:', data.duration);
})
.catch(error => {
console.log(error);
});
更新
如果getNextInsertBatch
只能异步获取数据,那么return一个承诺,并相应地更新sequence->source
回调:
return t.sequence(index => {
return getNextInsertBatch(index)
.then(data => {
if (data) {
const inserts = pgp.helpers.insert(data, cs);
return t.none(inserts);
}
});
});
相关链接:
我在使用 NodeJS 和 PostgreSQL 时遇到一个奇怪的错误,我希望你能帮我解决。
我有大量的数据集,大约有 200 万条条目要插入到我的数据库中。
一个数据包含4列:
id: string,
points: float[][]
mid: float[]
occurences: json[]
我是这样插入数据的:
let pgp = require('pg-promise')(options);
let connectionString = 'postgres://archiv:archiv@localhost:5432/fotoarchivDB';
let db = pgp(connectionString);
cityNet.forEach((arr) => {
db
.none(
"INSERT INTO currentcitynet(id,points,mid,occurences) VALUES ",
Inserts("${id},${points}::double precision[],${mid}::double precision[],${occurences}::json[]",arr))
.then(data => {
//success
})
.catch(error => {
console.log(error);
//error
});
})
function Inserts(template, data) {
if (!(this instanceof Inserts)) {
return new Inserts(template, data);
}
this._rawDBType = true;
this.formatDBType = function() {
return data.map(d => "(" + pgp.as.format(template, d) + ")").join(",");
};
这正好适用于前 309248 个数据片段,然后突然它只是错误地出现以下(看起来像)它试图插入的每个下一个数据:
{ error: syntax error at end of input
at Connection.parseE (/home/christian/Masterarbeit_reworked/projekt/server/node_modules/pg-promise/node_modules/pg/lib/connection.js:539:11)
at Connection.parseMessage (/home/christian/Masterarbeit_reworked/projekt/server/node_modules/pg-promise/node_modules/pg/lib/connection.js:366:17)
at Socket.<anonymous> (/home/christian/Masterarbeit_reworked/projekt/server/node_modules/pg-promise/node_modules/pg/lib/connection.js:105:22)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:548:20)
name: 'error',
length: 88,
severity: 'ERROR',
code: '42601',
detail: undefined,
hint: undefined,
position: '326824',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'scan.l',
line: '1074',
routine: 'scanner_yyerror' }
'position' 条目随着每个迭代错误消息而改变。
我可以重做,它总是在 309248 个条目后出错。 当我尝试插入更少的条目时,例如 1000 个条目,错误不会发生。
这让我很困惑。我认为 PostgreSQL 没有任何最大行数。此外,错误消息对我没有任何帮助。
已解决 发现错误。在我的数据中,有 "null" 个条目滑入其中。过滤掉空数据。 我将尝试其他插入数据的建议,因为当前的方式有效,但性能非常糟糕。
我不确定,但看起来你在最后一个元素 (309249) 的数据结构有误,而且 PostgreSQL 无法解析某些 属性
我是 pg-promise 的作者。您的整个方法应更改为以下方法。
通过pg-promise进行大量插入的正确方法:
const pgp = require('pg-promise')({
capSQL: true
});
const db = pgp(/*connection details*/);
var cs = new pgp.helpers.ColumnSet([
'id',
{name: 'points', cast: 'double precision[]'},
{name: 'mid', cast: 'double precision[]'},
{name: 'occurences', cast: 'json[]'}
], {table: 'currentcitynet'});
function getNextInsertBatch(index) {
// retrieves the next data batch, according to the index, and returns it
// as an array of objects. A normal batch size: 1000 - 10,000 objects,
// depending on the size of the objects.
//
// returns null when there is no more data left.
}
db.tx('massive-insert', t => {
return t.sequence(index => {
const data = getNextInsertBatch(index);
if (data) {
const inserts = pgp.helpers.insert(data, cs);
return t.none(inserts);
}
});
})
.then(data => {
console.log('Total batches:', data.total, ', Duration:', data.duration);
})
.catch(error => {
console.log(error);
});
更新
如果getNextInsertBatch
只能异步获取数据,那么return一个承诺,并相应地更新sequence->source
回调:
return t.sequence(index => {
return getNextInsertBatch(index)
.then(data => {
if (data) {
const inserts = pgp.helpers.insert(data, cs);
return t.none(inserts);
}
});
});
相关链接: