【问题标题】:How to import PostgreSQL database dump via node and pg如何通过 node 和 pg 导入 PostgreSQL 数据库转储
【发布时间】:2017-11-22 05:36:29
【问题描述】:

我正在尝试使用节点中的 pg 包将保存为纯文本文件的 PostgreSQL 数据库转储导入 psql。

到目前为止,我正在将文件作为字符串读取,然后尝试通过以下方法导入字符串:

var sql = fs.readFileSync('./dbDumpOutput').toString();
pg.connect('postgres://localhost:5432/testdb', function(err, client, done){
    if(err){
        console.log('error: ', err);
        process.exit(1);
    }
    client.query(sql, function(err, result){
    done();
    if(err){
        console.log('error: ', err);
        process.exit(1);
    }
    process.exit(0);
});

我收到以下错误:error: { error: syntax error at or near "\"

这是我必须解析的 dbdump 的格式问题,还是我做错了什么?

【问题讨论】:

    标签: sql node.js postgresql


    【解决方案1】:

    这是因为纯文本 pg_dump 使用 COPY FROM STDIN,它以 \. 结尾。我认为你不能使用这个COPY FROM STDIN brianc 的 pg 模块(否则this 中就不需要了)。您可以尝试在 pg_dump 上指定 --inserts 来生成插入。但我建议只使用用于 pg_dump 生成的转储的工具进行恢复,例如 psql

    【讨论】:

    • 我了解如何在命令行中使用 psql,但是如何通过 node 运行我的 psql 命令?
    • 您可以生成一个进程。就像任何其他带有参数的程序一样
    【解决方案2】:

    我在下面提供了一个可行的解决方案,使用 psql 而不是 pg。

    const { spawn } = require('child_process');
    
    const child = spawn('createdb', ['psqltest']);
    
    child.on('exit', function (code, signal) {
      console.log('child process exited with ' +
                  `code ${code} and signal ${signal}`);
      const cat = spawn('cat',['dbDumpOutput']);
      const imp = spawn('psql',['psqltest']);
      cat.stdout.pipe(imp.stdin);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 2014-10-12
      相关资源
      最近更新 更多