如何使用 Sequelize 和 node.js 进行批量插入
How to do Bulk insert using Sequelize and node.js
js + sequelize 使用 JSON 插入 280K 行数据。
JSON是一个280K的数组。有没有办法批量插入块。我看到更新数据需要很多时间。当我试图将数据减少到 40K 行时,它工作得很快。我采取了正确的方法吗?请指教。我正在使用 postgresql 作为后端。
PNs.bulkCreate(JSON_Small)
.catch(function(err) {
console.log('Error ' + err);
})
.finally(function(err) {
console.log('FINISHED + ' \n +++++++ \n');
});
我利用异步库的 cargo
实用程序一次最多加载 1000 行。请参阅以下用于将 csv 加载到数据库中的代码:
var fs = require('fs'),
async = require('async'),
csv = require('csv');
var input = fs.createReadStream(filename);
var parser = csv.parse({
columns: true,
relax: true
});
var inserter = async.cargo(function(tasks, inserterCallback) {
model.bulkCreate(tasks).then(function() {
inserterCallback();
}
);
},
1000
);
parser.on('readable', function () {
while(line = parser.read()) {
inserter.push(line);
}
});
parser.on('end', function (count) {
inserter.drain = function() {
doneLoadingCallback();
}
});
input.pipe(parser);
如果您真的想使用 bulkInsert,那么我之前的回答就足够了。但是,如果您有大量数据,您将 运行 内存不足!最好是使用一些内置的数据库方法最适合这个。问题是在执行 bulkCreate 之前,您正在将所有数据加载到内存中。如果你有一百万行,你可能 运行 在它执行之前内存不足。即便如此,如果您使用 async.cargo 之类的方法将其排队,您仍将等待数据库返回给您,而数据异步消耗您的所有内存。
我的解决方案是放弃 sequelize 以加载数据(至少在他们实现流媒体或其他东西之前(请参阅他们的 github issue #2454)). I ended up creating db-streamer, but it just has pg support for now. You'll want to look at streamsql for mysql。
以下问题与您在此处需要的答案相同:
- 使用流读取数据并解析数据;
- 使用方法组合stream.read and sequence from spex读取流并逐个执行查询。
您可以使用 Sequelize 的内置 bulkCreate
方法来实现此目的。
User.bulkCreate([
{ username: 'barfooz', isAdmin: true },
{ username: 'foo', isAdmin: true },
{ username: 'bar', isAdmin: false }
]).then(() => { // Notice: There are no arguments here, as of right now you'll have to...
return User.findAll();
}).then(users => {
console.log(users) // ... in order to get the array of user objects
})
js + sequelize 使用 JSON 插入 280K 行数据。 JSON是一个280K的数组。有没有办法批量插入块。我看到更新数据需要很多时间。当我试图将数据减少到 40K 行时,它工作得很快。我采取了正确的方法吗?请指教。我正在使用 postgresql 作为后端。
PNs.bulkCreate(JSON_Small)
.catch(function(err) {
console.log('Error ' + err);
})
.finally(function(err) {
console.log('FINISHED + ' \n +++++++ \n');
});
我利用异步库的 cargo
实用程序一次最多加载 1000 行。请参阅以下用于将 csv 加载到数据库中的代码:
var fs = require('fs'),
async = require('async'),
csv = require('csv');
var input = fs.createReadStream(filename);
var parser = csv.parse({
columns: true,
relax: true
});
var inserter = async.cargo(function(tasks, inserterCallback) {
model.bulkCreate(tasks).then(function() {
inserterCallback();
}
);
},
1000
);
parser.on('readable', function () {
while(line = parser.read()) {
inserter.push(line);
}
});
parser.on('end', function (count) {
inserter.drain = function() {
doneLoadingCallback();
}
});
input.pipe(parser);
如果您真的想使用 bulkInsert,那么我之前的回答就足够了。但是,如果您有大量数据,您将 运行 内存不足!最好是使用一些内置的数据库方法最适合这个。问题是在执行 bulkCreate 之前,您正在将所有数据加载到内存中。如果你有一百万行,你可能 运行 在它执行之前内存不足。即便如此,如果您使用 async.cargo 之类的方法将其排队,您仍将等待数据库返回给您,而数据异步消耗您的所有内存。
我的解决方案是放弃 sequelize 以加载数据(至少在他们实现流媒体或其他东西之前(请参阅他们的 github issue #2454)). I ended up creating db-streamer, but it just has pg support for now. You'll want to look at streamsql for mysql。
以下问题与您在此处需要的答案相同:
- 使用流读取数据并解析数据;
- 使用方法组合stream.read and sequence from spex读取流并逐个执行查询。
您可以使用 Sequelize 的内置 bulkCreate
方法来实现此目的。
User.bulkCreate([
{ username: 'barfooz', isAdmin: true },
{ username: 'foo', isAdmin: true },
{ username: 'bar', isAdmin: false }
]).then(() => { // Notice: There are no arguments here, as of right now you'll have to...
return User.findAll();
}).then(users => {
console.log(users) // ... in order to get the array of user objects
})