为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 exec.Command 的输出通过管道传输到 Golang 中的另一个命令

如何将 exec.Command 的输出通过管道传输到 Golang 中的另一个命令

Go
茅侃侃 2021-11-08 16:15:18
我有八个 Microsoft Access 数据库,每个数据库大约有 215 个表,我需要将这些数据库转移到 postgresql 中,所以我使用了 mdb-tools 并导出了仅一步的方案;但是当涉及将表数据导出到 postgres 时,我将其直接导入到 postgresql 中必须为每个表编写此命令:mdb-export -I postgres -q \' myaccessdatabase.mdb table-name | psql -d mypsqldatabase -U postgres -w -h localhost 所以我一直在尝试写一个go命令程序来做如下: 1.首先执行一个命令来列出表名。这将是下一个命令的 arg。2.然后启动range loop执行一个导出tanle数据的命令,这个命令的输出是管道到下一个命令。3.这个命令是psql,它将写入上一个命令的输出(即sql insert statment)package mainimport (    "bufio"    "log"    "os"    "os/exec")func main() {    // command to Collect tables name and list it to the next command           tablesname := exec.Command("mdb-tables", "-1", "myaccessdatabase.mdb")    // Run the command on each table name and get the output pipe/feed into the psql shell     for _, table := range tablesname {        ls := exec.Command("mdb-export", "-I", "postgres", "-q", "\'", "myaccessdatabase.mdb", table)        // | psql -d mydatabase -U postgres -w -h localhost command which will write each line from the output of previouse command's         visible := exec.Command("psql", "-d", "mypsqldatabase", "-U", "postgres", "-w", "-h", "localhost")    }}所以我试图将输出通过管道传输到下一个命令的标准输入中,但无法实现它,同时我正在尝试使用 gooutin 和通道,甚至无法将其变成最后一个命令。
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

该exec.Command函数只创建命令,不执行它。


要从 获取输出tablesname := exec.Command("mdb-tables", "-1", "myaccessdatabase.mdb"),您需要运行该命令并捕获其输出:


tablesname := exec.Command("mdb-tables", "-1", "myaccessdatabase.mdb")

//capture the output pipe of the command

outputStream := bufio.NewScanner(tablesname.StdoutPipe())

tablesname.Start()  //Runs the command in the background


for outputStream.Scan() {   

//Default scanner is a line-by-line scan, so this will advance to the next line

    ls := exec.Command("mdb-export", "-I", "postgres", "-q", "\'", "myaccessdatabase.mdb", outputStream.Text())

    ls.Run()  //Blocks until command finishes execution


    visible := exec.Command("psql", "-d", "mypsqldatabase", "-U", "postgres", "-w", "-h", "localhost")

    visible.Run()

}


tablesname.Wait()  //Cleanup 

注意:对于数据库交互,exec不是惯用代码。


SQL 库允许与数据库直接交互:http : //golang.org/pkg/database/sql/


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 325 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信