gpt4 book ai didi

postgresql - 命令StdinPipe关闭太早

转载 作者:行者123 更新时间:2023-12-01 22:21:44 25 4
gpt4 key购买 nike

我一直在尝试使用pg_restore调用exec.Command并将StdinPipe与数据库转储文件中的数据一起馈送,它适用于1Mb以下的小文件,但由于write |1: broken pipe错误而无法进行较大的转储。我还尝试逐行扫描并写入管道,但是它导致相同的错误,并且在单独的goroutine中像cmd.Run()一样运行也没有帮助。
执行:1.14
作业系统:macOS

cmd := exec.Command("pg_restore", "--clean", "-n public", "--dbname=DB_URI")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
pw, err := cmd.StdinPipe()
defer pw.Close()
...

done := make(chan struct{})
errCh := make(chan error)
file, err := os.Open("dumpfile")
defer file.Close()

if err := cmd.Start(); err != nil {
return err
}

_, err = io.Copy(pw, file)

我在做什么错或如何保持管道畅通?

最佳答案

当使用cat而不是pg_restore时,您的代码有效。
另一方面,当使用head -10时,我遇到了与您相同的错误,这实际上是您期望的。
由于您是在异步模式下启动cmd的,因此如果pg_restore在使用所有STDIN之前暂停,则io.Copy如果尝试在封闭的管道上写入,则会遇到此类错误。
检查pg_restore命令的状态(最终返回码,在STDERR上打印的内容,日志...),以查看是否存在实际错误。
您可以将此错误视为正常的指示,即您不再应该向此命令提供输入。

关于postgresql - 命令StdinPipe关闭太早,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63073597/

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