お世話になっております。
しゃまとんです。

最近、golangに触れる機会が多くなっております。Gopherかわいい(*´∀`)

さて、goでDBを初期化するためのバッチファイルを書いていたのですが、

$ mysql -uroot -ppassword dbname > hoge.sql

上記のようにgoからシステムコマンドを実行したかったのですが、もろもろ調査して標準入力含めて、実行できた際のメモです。

はじめは、上記のコマンドをそのまま、exec.Commandに渡してやろうとしたのですが、"<", “>” のような特殊文字は渡せないみたいで、 StdinPipeを使うことで入力を渡すことができるようです。

下記がサンプルになります。

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での例ですが、変数等は適宜置き換えたらいいのではないかと思います。

以上です。

■参考