web-dev-qa-db-ja.com

goLangを使用してSQLファイルを実行する方法

私は、データベースの作成、削除、ポピュレーションに関する多くのことを含む.sqlファイルを持っています。 SQLファイルを実行できるgo関数を持つことは可能ですか?データベースとしてpostgresを使用し、すべてのデータベーストランザクションにlib/pqドライバーを使用しています。しかし、私は自分のgolangプロジェクトでこのsqlファイルを実行するための任意のライブラリを開いています。

11
codec

同様の需要を求めてdotsqlを見つけました。名前付きSQLステートメント/準備ステートメントを特定のファイルからロードして実行できます。

// Get a database handle
db, err := sql.Open("sqlite3", ":memory:")

// Loads queries from file
dot, err := dotsql.LoadFromFile("queries.sql")

// Run queries
res, err := dot.Exec(db, "create-users-table")
res, err := dot.Exec(db, "create-user", "User Name", "[email protected]")
rows, err := dot.Query(db, "find-users-by-email", "[email protected]")
row, err := dot.QueryRow(db, "find-one-user-by-email", "[email protected]")

stmt, err := dot.Prepare(db, "drop-users-table")
result, err := stmt.Exec()

参照: https://github.com/gchaincl/dotsql

7
carusyte

標準ライブラリのos/execパッケージを使用できます。データベースドライバは必要ありません。 postgreSQLの場合、コードは次のようになります。

cmd := exec.Command("psql", "-U", psqlUser, "-h", psqlHost, "-d", psqlDBName, "-a", "-f", sqlFilePath)

var out, stderr bytes.Buffer

cmd.Stdout = &out
cmd.Stderr = &stderr

err := cmd.Run()
if err != nil {
    log.Fatalf("Error executing query. Command Output: %+v\n: %+v, %v", out.String(), stderr.String(), err)
}
5
Mayank Patel

ファイルを個別のリクエストに分割して、1つずつ実行することができます。

file, err := ioutil.ReadAll("/path/to/file")

if err != nil {
    // handle error
}

requests := strings.Split(string(file), ";")

for _, request := range requests {
    result, err := db.Exec(request)
    // do whatever you need with result and error
}
5
Pavel Kazhevets

コマンドラインで実行するのは面倒です。パスワードの設定、パス変数が適切に設定されていることの確認などの問題に対処する必要があります。私は、データベースドライバーを使用し、Goを使用してそれを呼び出すのが一番だと思います。

次の例では、Postgresに sql driverのpgx実装 を使用しています。任意のドライバー実装でそれを行うことができます。

path := filepath.Join("path", "to", "script.sql")

c, ioErr := ioutil.Readfile(path)
if ioErr != nil {
   // handle error.
}
sql := string(c)
_, err := *pgx.Conn.Exec(sql)
if err != nil {
  // handle error.
}

説明:

  1. OSにとらわれない方法でSQLスクリプトへのパスを取得します。
  2. ファイルの内容を文字列に読み取ります。
  3. SQLドライバーを使用して、ファイル内のステートメントを実行します。
3
kovac