お世話になっております。
しゃまとんです。
最近、golangに触れる機会が多くなっております。Gopherかわいい(*´∀`)
さて、goでDBを初期化するためのバッチファイルを書いていたのですが、
1 |
$ mysql -uroot -ppassword dbname > hoge.sql |
上記のようにgoからシステムコマンドを実行したかったのですが、もろもろ調査して標準入力含めて、実行できた際のメモです。
はじめは、上記のコマンドをそのまま、exec.Commandに渡してやろうとしたのですが、”<“, “>”のような特殊文字は渡せないみたいで、StdinPipeを使うことで入力を渡すことができるようです。
下記がサンプルになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package main import ( "fmt" "io/ioutil" "os/exec" ) func main() { user := "root" password := "password" dbName := "dbname" path, err := exec.LookPath("mysql") cmd := exec.Command(path, "-u"+user, "-p"+password, dbName) // 入力SQLファイル readFile := "/home/shamaton/test.sql" input, err := ioutil.ReadFile(readFile) if err != nil { panic(err) } stdin, _ := cmd.StdinPipe() stdin.Write(input) stdin.Close() var stdErr, stdOut bytes.Buffer cmd.Stderr = &stdErr cmd.Stdout = &stdOut // exec err = cmd.Run() if err != nil { fmt.Println(stdErr.String()) panic(err) } fmt.Println(stdOut.String()) } |
paswwordに関しては-pにくっつけておかないとエラーになるかと思います。
mysqlでの例ですが、変数等は適宜置き換えたらいいのではないかと思います。
以上です。