diff --git a/11.NextResultSet/Taskfile.yml b/11.NextResultSet/Taskfile.yml new file mode 100644 index 0000000..0dfce79 --- /dev/null +++ b/11.NextResultSet/Taskfile.yml @@ -0,0 +1,12 @@ +# https://taskfile.dev + +version: "3" + +vars: + DBFILE: chinook.db + +tasks: + default: + cmds: + - cp -f ../{{.DBFILE}} . + - go run main.go diff --git a/11.NextResultSet/main.go b/11.NextResultSet/main.go new file mode 100644 index 0000000..5fda1dc --- /dev/null +++ b/11.NextResultSet/main.go @@ -0,0 +1,108 @@ +package main + +import ( + "database/sql" + "fmt" + "log" + "strings" + + "github.com/devlights/sqlmap" + "github.com/k0kubun/pp/v3" + + _ "github.com/mattn/go-sqlite3" +) + +func init() { + log.SetFlags(0) +} + +// 11.NextResultSet +// +// データベースドライバ側の実装が行われている場合は +// 一度に複数の結果セットを取得することができる。 +// その場合、*sql.Rows.NextResultSet() を呼び出し +// 次のカーソルに進める。 +// +// - https://pkg.go.dev/database/sql@go1.22.0#example-DB.Query-MultipleResultSets +// +// 本リポジトリで利用している github.com/mattn/go-sqlite3 は、複数の結果セットに +// 対応していないことが作者さんのブログ記事にて記載されている。 +// +// - https://mattn.kaoriya.net/software/lang/go/20161106232834.htm +// +// 以下、作者さんのブログ記事より引用。 +// +// > go-sqlite3 もサポートする予定でしたが、sqlite3 の複数クエリ実行は golang の複数結果セットが期待する物と異なる為、現状は実装を見送りました。 +// +// そのため、以下は実装のみを記載しておく。 +// +// 恐らく、PostgreSQLとMySQLのドライバは対応しているので可能なはず。 +// (MySQLは、multiStatements=trueの指定が必要) +func main() { + if err := run(); err != nil { + log.Panic(err) + } +} + +func run() error { + var ( + db *sql.DB + err error + ) + + db, err = sql.Open("sqlite3", "./chinook.db") + if err != nil { + return err + } + defer db.Close() + + var ( + query string + sb strings.Builder + ) + + sb.WriteString("SELECT ArtistId,Name FROM artists LIMIT 2;") + sb.WriteString("SELECT TrackId,Name FROM tracks LIMIT 2;") + query = sb.String() + + var ( + rows *sql.Rows + ) + + rows, err = db.Query(query) + if err != nil { + return err + } + defer rows.Close() + + var ( + m []map[string]any + ) + + // + // First Result + // + m, err = sqlmap.MapRows(rows) + if err != nil { + return err + } + pp.Println(m) + + // + // 次の結果セットへ + // + if !rows.NextResultSet() { + return fmt.Errorf("rows.NextResultSet() returns false") + } + + // + // Second Result + // + m, err = sqlmap.MapRows(rows) + if err != nil { + return err + } + pp.Println(m) + + return nil +} diff --git a/go.mod b/go.mod index 18d07b6..77833b1 100644 --- a/go.mod +++ b/go.mod @@ -3,3 +3,15 @@ module github.com/devlights/try-golang-database go 1.22 require github.com/mattn/go-sqlite3 v1.14.22 + +require ( + github.com/devlights/sqlmap v0.1.1 + github.com/k0kubun/pp/v3 v3.2.0 +) + +require ( + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/text v0.14.0 // indirect +) diff --git a/go.sum b/go.sum index e8d092a..695fb09 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,39 @@ +github.com/devlights/sqlmap v0.1.1 h1:z4HKpzBgd7VoARtvNu49TudILid2NS2pzhRwmEiZtdU= +github.com/devlights/sqlmap v0.1.1/go.mod h1:R6JOMjK30hRREaqdTdoI1i8isahrPsvbgdicGLhS7cQ= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= +github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs= +github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= +modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk=