繁体   English   中英

如何从CSV文件向Postgresql数据库插入批量数据?

[英]How to insert bulk data to postgresql db from CSV file?

我必须将CSV文件中存在的100多个记录插入到PostgreSQL数据库中。 所以我尝试了下面提到的代码,它正在从文件中读取数据,但是无法将它们插入到PostgreSQL表中,所以还有其他方法可以执行此操作吗? 像csvtojson等?

const csv = require('csv');
var csvParser = require('csv-parse');

Controller.uploadCsv = async(data) => {
    fs.createReadStream(data.path)
        .pipe(csvParser({
            delimiter: '\t', 
            endLine: '\n', 
            escapeChar: '"', 
            enclosedChar: '"'
        }))
        .on('data', function(data) {
             console.log(data)// returning in console mentioned below
             console.log(data.name) // is undefined 

             const add = {
                name: data.name,
                address: data.address,
                phoneNo: data.phoneNumber,
                email: data.email,
                created_at: new Date(),
                updated_at: new Date()
            };
            const result = await models.table.create(add);
        })
        .on('end', function(data) {
             console.log('reading finished')
        })
}

router.js

router.post('/file', upload.single('file'),(req, res, next) => {
    Controller.uploadCsv(req.file)
        .then((result) => res.json(result))
        .catch(next)
})

控制台数据

    [ 'name',
      'address'
      'phoneNumber',
      'email',
      'created_at',
      'updated_at']
    [ 'aaa',
      'delhi',
      '1102558888',
      'test@gmail.com',
      '2017-10-08T06:17:09.922Z',
      '2018-10-08T06:17:09.922Z',]
    [ 'Oreo',
      'bgl',
      '1112589633',
      'test123@gmail.com',
      '2017-10-08T06:17:09.922Z',
      '2018-10-08T06:17:09.922Z' ]

TL; DR。 您的代码有一个小错误,可能会引起您的问题-当您使用await时,要运行它,您需要在data处理程序中的function前放置async它可能适用于小文件,但请继续阅读这不是正确的解决方案-我在下面添加了一种适当的方法

ES6异步/等待是一种语言构造,可让您await Promise的解析并继续执行async功能中的代码。 在您的代码中确实有一个async function声明,但是您在非异步函数中添加了await 需要说明的是-仅在最接近的function() {async时才允许使用await关键字-在您的情况下则不允许。

其实,我不认为你的代码,甚至会编写一些更改后,你会直接落在中提到的一个问题这个问题 -这是因为你想在节点同步事件处理程序运行的异步操作。 该对数据库的异步插入将开始运行,但是end事件将在操作完成之前触发

为了正确执行此操作-您可以完全使用转换流或完全放弃流式传输,而仅使用CSV中的数组(为此有足够多的好模块)。 但是,我是scramjet框架的作者,我也认为这应该像您编写它时那样简单,甚至可能更简单。

这是将执行您想要的代码:

const {StringStream} = require('scramjet');

Controller.uploadCsv = async(data) => 
    fs.createReadStream(data.path)
        .pipe(new StringStream('utf-8'))
        .CSVParse({
            delimiter: '\t', 
            newline: '\n', 
            escapeChar: '"', 
            quoteChar: '"'
        })
        .map(data => ({
            name: data.name,
            address: data.address,
            phoneNo: data.phoneNumber,
            email: data.email,
            created_at: new Date(),
            updated_at: new Date()
        }))
        .each(async entry => await models.table.create(entry))
        .each(result => log(result)) // if it's worth logging
        .run();

Scramjet只是在下面使用流(所有类都扩展了内置的node.js流),但是在Array等上公开了类似于同步接口的接口。您可以运行异步操作,并从run操作返回Promise。

在OnData函数上插入async关键字。 请记住,它不是顺序执行,因此记录可以在一个程序执行与另一个程序执行之间以完全不同的顺序插入。

更换:

.on('data', function(data) {

附:

.on('data', async function(data) {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM